我有一些长度为2*n
的bytearray
:
a1 a2 b1 b2 c1 c2
我需要将每个2字节的单词中的字节顺序进行转换,并使之变为:
a2 a1 b2 b1 c2 c1
现在我使用的方法很慢,不适合我的任务:
converted = bytearray([])
for i in range(int(len(chunk)/2)):
converted += bytearray([ chunk[i*2+1], chunk[i*2] ])
有没有可能通过调用某些系统/libc函数来切换bytearray
的大小端?
好的,谢谢大家,我记录了一些建议:
import timeit
test = [
"""
converted = bytearray([])
for i in range(int(len(chunk)/2)):
converted += bytearray([ chunk[i*2+1], chunk[i*2] ])
""",
"""
for i in range(0, len(chunk), 2):
chunk[i], chunk[i+1] = chunk[i+1], chunk[i]
""",
"""
byteswapped = bytearray([0]) * len(chunk)
byteswapped[0::2] = chunk[1::2]
byteswapped[1::2] = chunk[0::2]
""",
"""
chunk[0::2], chunk[1::2] = chunk[1::2], chunk[0::2]
"""
]
for t in test:
print(timeit.timeit(t, setup='chunk = bytearray([1]*10)'))
并且结果是:
$ python ti.py
11.6219761372
2.61883187294
3.47194099426
1.66421198845
现在针对步长为2的切片赋值已经是最快的了。同时感谢F先生提供的详细解释,但由于涉及到numpy,我尚未尝试。