当预先知道整个字符串的长度时,我试图通过连接多个较短的字符串来找出创建长字节字符串(或字节数组)的最有效方法。我制作了这个脚本并得出了以下结果:
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) 创建一个字节列表并使用 join() 方法是结果暗示的方式吗?
2)为什么使用字节列表比使用似乎是为这种类型的东西设计的字节数组快得多?
3) 你会认为初始化的数组会比未初始化的数组快,因为初始化的数组不需要调整大小(注意它偶尔会表现得更好,但不是很多而且不一致)。不是因为切片操作更快吗?