<p>可以使用slice赋值,步骤为2:</p>
<pre><code>byteswapped = bytearray(len(original))
byteswapped[0::2] = original[1::2]
byteswapped[1::2] = original[0::2]
</code></pre>
<p>或者如果你想在适当的地方做:</p>
<pre><code>original[0::2], original[1::2] = original[1::2], original[0::2]
</code></pre>
<p>计时显示,对于大型数组,切片的性能大大优于Python级别的循环:</p>
<pre><code>>>> timeit.timeit('''
... for i in range(0, len(chunk), 2):
... chunk[i], chunk[i+1] = chunk[i+1], chunk[i]''',
... 'chunk=bytearray(1000)')
81.70195105159564
>>>
>>> timeit.timeit('''
... byteswapped = bytearray(len(original))
... byteswapped[0::2] = original[1::2]
... byteswapped[1::2] = original[0::2]''',
... 'original=bytearray(1000)')
2.1136113323948393
>>>
>>> timeit.timeit('chunk[0::2], chunk[1::2] = chunk[1::2], chunk[0::2]', 'chunk=
bytearray(1000)')
1.79349659994989
</code></pre>
<p>对于小数组,切片仍然优于显式循环,但差别并不大:</p>
<pre><code>>>> timeit.timeit('''
... for i in range(0, len(chunk), 2):
... chunk[i], chunk[i+1] = chunk[i+1], chunk[i]''',
... 'chunk=bytearray(10)')
1.2503637694328518
>>>
>>> timeit.timeit('''
... byteswapped = bytearray(len(original))
... byteswapped[0::2] = original[1::2]
... byteswapped[1::2] = original[0::2]''',
... 'original=bytearray(10)')
0.8973060929306484
>>>
>>> timeit.timeit('chunk[0::2], chunk[1::2] = chunk[1::2], chunk[0::2]', 'chunk=
bytearray(10)')
0.6282232971918802
</code></pre>