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

sow*_*owa 3 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
Run Code Online (Sandbox Code Playgroud)

xsc*_*ott 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)
Run Code Online (Sandbox Code Playgroud)

  • @nate c,Python字符串是一个连续字节和相关长度的数组.他的x.join(...)代码每次在分配旧字符串之前都会创建一个新的,稍微长一点的字符串.这是O(N ^ 2)行为.你错了,你不应该让我失望. (3认同)
  • 建议将一个字符串构建为列表并且只在必要时加入它们(最好是在构建整个列表之后),据我所知仍然有效.这是很长一段时间以来推荐的Python练习. (2认同)

Sco*_*ths 5

我认为你根本不应该使用字符串连接.最好是创建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)