以块的形式处理字节串
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])
我有一个很长的字节串,比如这个(实际值可能是随机的):
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])