在下面的代码中,连接是瓶颈.正如你所看到的,我已经尝试了一些复杂的方法来加快速度,但无论如何它的血腥都很慢.我想知道我能做些什么来使它紧固.
简单和秘密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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我认为你根本不应该使用字符串连接.最好是创建bytearray最终数据的完整大小的可变项,然后设置每个字节.这是非常多的O(N),并且使用a 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |