如何加速Python中的字符串连接?

时间:2010-11-27 02:19:59

标签: python

在下面的代码中,连接是瓶颈。 正如你所看到的,我已经尝试了一些复杂的方法来加快速度,但无论如何它的血腥都很慢。我想知道我能做些什么来使它紧固。

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

2 个答案:

答案 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