以块的形式处理字节串

Processing a byte string in chunks

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

in_var = b'\x01\x02\x03\x04\x05\x06...\xff'

我还有一个函数可以对一大块字节和 returns 相同数量的字节执行操作(在本例中假设为 10 个字节):

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

我想用 foo() 处理所有 10 字节的块(发送最后一个块,如果最后剩下的字节少于 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])