我有一个“bytes”对象和一个整数掩码,“bytes”对象中的所有字节都要与掩码进行异或操作。我需要在较大的“bytes”对象(约4096 KB)上重复执行此操作。
这是我编写的代码,它可以正常工作,但占用CPU很高,导致我的脚本运行缓慢:
这是我编写的代码,它可以正常工作,但占用CPU很高,导致我的脚本运行缓慢:
# 'data' is bytes and 'mask' is int
bmask = struct.pack('!I', mask) # converting the "int" mask to "bytes" of 4 bytes
a = bytes(b ^ m for b, m in zip(data, itertools.cycle(bmask)))
我能想到的最好方案是这个,速度快了大约20倍:
# 'data' is bytes and 'mask' is int
# reversing the bytes of the mask
bmask = struct.pack("<I", mask)
mask = struct.unpack(">I", bmask)[0]
# converting from bytes to array of "int"s
arr = array.array("I", data)
# looping over the "int"s
for i in range(len(arr)):
arr[i] ^= mask
# must return bytes
a = bytes(arr)
我的问题是:
- 有没有更有效率的方法来完成这个任务(在CPU方面)?
- 有没有更“清晰”的方法来完成这个任务(不影响性能)?
附言:如果有任何重要性,我正在使用Python 3.5。
data
是什么?它是列表、字节、迭代器还是其他什么? - Ecir Hana