在下面的代码中,连接是瓶颈。 正如你所看到的,我已经尝试了一些复杂的方法来加快速度,但无论如何它的血腥都很慢。我想知道我能做些什么来使它紧固。
BTW无论是普通还是秘密都是从二进制文件读取的数据,它们相当大(大约1mb)
x = b''
if len(plain) < len(secret*8):
return False
i = 0
for secByte in secret:
for j in range(8):
z = setBit(plain[i],0,getBit(secByte,j))
#x += bytes([z])
x = x.join([b"", bytes([z])])
#x = array.array("B",(int(z) for z in x.join([b"", bytes([z])]))).tostring()
i = i+1
答案 0 :(得分:7)
Python的列表有O(1)追加,至少在摊销意义上。您可以构建一个大列表,然后在最后加入它们,而不是在最里面的列表中进行连接。这会将您的算法从O(N ^ 2)变为O(N)。在不确切知道setBit()和getBit()函数正在做什么的情况下给你工作代码很难,但是像这样:
L = []
for secByte in secret:
for j in range(8):
z = ...
L.append(z)
x = b"".join(L)
答案 1 :(得分:5)
我认为你根本不应该使用字符串连接。最好创建最终数据的完整大小的可变bytearray
,然后设置每个字节。这非常O(N),并且使用bytearray
进行的操作比字符串操作更自然:
x = bytearray(len(secret)*8) # creates an array of zero bytes
i = 0
for secByte in secret:
for j in range(8):
x[i] = setBit(plain[i], 0, getBit(secByte, j))
i += 1