Я пытаюсь найти наиболее эффективный способ создания длинной байтовой строки (или bytearray) путем конкатенации нескольких коротких строк, когда длина всей строки известна заранее. Я сделал этот сценарий и придумали с этими результатами:Python bytearray verses list of bytes
import time
MSG = b'test message'
COUNT = 30000
def bytes_list_test():
tStart = time.clock()
l = []
for i in range(COUNT):
l.append(MSG)
bs = b''.join(l)
print('byte list time:', time.clock() - tStart)
def bytearray_test():
tStart = time.clock()
ba = bytearray()
for i in range(COUNT):
for c in MSG:
ba.append(c)
print('array time:', time.clock() - tStart)
def initialized_bytearray_test():
tStart = time.clock()
ba = bytearray([0x00]*len(MSG)*COUNT)
for i in range(COUNT):
ba[i*len(MSG):i*len(MSG)+len(MSG)] = MSG
print('initialized array time:', time.clock() - tStart)
bytes_list_test()
bytearray_test()
initialized_bytearray_test()
Результаты:
byte list time: 0.0076534920117410365
array time: 0.08107178658246994
initialized array time: 0.08843219671325642
Несколько вопросов:
1) создает список байтов и с помощью объединения() метод путь, который подразумевается под результатами?
2) Почему использование списка байтов намного быстрее, чем использование bytearray, похоже, что оно предназначено для такого типа вещей?
3) Вы могли бы подумать, что инициализированный массив будет быстрее, чем неинициализированный массив, потому что инициализированный массив не нужно изменять размер (обратите внимание, что он иногда работал лучше, но не так много и непоследовательно). Не быстрее ли это из-за операции нарезки?