以块为单位处理字节字符串



我有一个很长的字节字符串,比如这样(实际值可能是随机的(:

in_var = b'x01x02x03x04x05x06...xff'

我还有一个函数,它对一块字节执行操作,并返回相同数量的字节(本例中假设为10个字节(:

def foo(chunk):
# do smth with chunk
# ......
return chunk

我想用foo()处理10个字节的所有块的in_var(如果最后剩下不到10个字节,则按原样发送最后一个块(,并创建一个带有输出的新变量out_var

我目前的做法花费的时间太长了:

out_var = b''
for chunk in range(0, len(in_var), 10):
out_var += foo(in_var[chunk: chunk + 10])

函数foo()每次运行只需要几分之一秒,因此总数应该非常快(所有10个块的总和(。然而,我的时间变长了一个数量级。

我也尝试过类似的结果:

import numpy as np
import math
in_var= np.array_split(np.frombuffer(in_var, dtype=np.uint8), math.ceil(len(in_var)/10))
out_var= b"".join(map(lambda x: foo(x), in_var))

对于这个例子,foo()只能处理10个字节(例如:它是一个具有固定块大小的加密函数(,如果给它一个较小的块,它只需要填充就可以使块成为10个字节。假设我无法控制它,foo()只能处理10字节的块。

有更快的方法吗?作为最后的手段,我可能不得不并行化我的代码,这样所有的块都可以并行处理。。。

谢谢!


更新:

显然,我没有正确测量foo()所花费的时间。事实证明,foo()占据了大部分时间,因此是上面评论的数量级。再次感谢您的意见和建议,尽管如此,我还是做了一些改进。并行化代码似乎是正确的前进道路。

for循环的问题在于它创建了一个新字符串,每次都稍微长一点,并将旧数据复制到新字符串。您可以通过预分配字节并直接复制来加快速度:

out_var = bytearray(len(in_var))
for chunk in range(0, len(in_var), 10):
out_var[chunk: chunk + 10] = foo(in_var[chunk: chunk + 10])

相关内容

  • 没有找到相关文章

最新更新