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

3 投票
2 回答
1076 浏览
提问于 2025-04-16 07:40

在下面的代码中,连接字符串的过程非常慢。你可以看到我尝试了一些复杂的方法来加快这个速度,但无论如何还是很慢。我想知道有没有什么办法可以让它更快。

顺便说一下,plain和secret都是从二进制文件中读取的数据,而且它们的大小都挺大的(大约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 个回答

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)
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

撰写回答