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