python3中bytes()的快速串联

al.*_*atv 3 python byte list

我在 python3 中有一个字节字符串数组(它是一个音频块)。我想从中生成一个大字节串。简单的实现有点慢。怎样才能做得更好呢?

chunks = []
while not audio.ends():
  chunks.append( bytes(audio.next_buffer()) )
  do_some_chunk_processing()

all_audio=b''
for ch in chunks:
  all_audio += ch
Run Code Online (Sandbox Code Playgroud)

怎样才能做得更快呢?

Ami*_*ial 7

使用bytearray()

from time import time

c = b'\x02\x03\x05\x07' * 500 # test data

# Method-1 with bytes-string

bytes_string = b''

st = time()
for _ in range(10**4):
    bytes_string += c

print("string concat -> took {} sec".format(time()-st))

# Method-2 with bytes-array

bytes_arr = bytearray()

st = time()
for _ in range(10**4):
    bytes_arr.extend(c)
# convert byte_arr to bytes_string via
bytes_string = bytes(bytes_arr)

print("bytearray extend/concat -> took {} sec".format(time()-st))

Run Code Online (Sandbox Code Playgroud)

我的 Win10|Corei7-7th Gen 中的基准测试显示:

string concat -> took 67.27699875831604 sec
bytearray extend/concat -> took 0.08975911140441895 sec
Run Code Online (Sandbox Code Playgroud)

该代码非常不言自明。而不是使用string+=next_block,使用bytearray.extend(next_block)。构建后,bytearray您可以使用bytes(bytearray)来获取字节字符串。

  • 最后是一个快速的解决方案,我动态添加了超过 50,000 个字节块,并且通过使用“bytearray”将速度提高了 140 倍。 (2认同)