У меня есть bytearray
с длиной 2*n
:эффективный способ поменять местами байты в питона
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] ])
Можно ли переключать endia n из bytearray
, вызвав некоторую функцию system/libc?
Ок, спасибо всем, я приурочен некоторые предложения:
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
Niiiiiiiiiiice. – kindall
выглядит очень круто – user3479125
@ user3479125: Я исправил неэффективность в том, как мой код создавал массив 'byteswapped'; он должен теперь превзойти явный цикл, если вы измените свои тайминги. Я также добавил решение на месте, которое должно быть еще быстрее. Кроме того, если вы попробуете свои тайминги с более крупными массивами, вы обнаружите, что явный цикл масштабируется намного хуже, чем нарезка из-за больших накладных интерпретаторов. – user2357112