<p>如果使用numpy的<code>frombuffer</code>函数,则可以构造一个实际共享<code>bytearray</code>物理内存的numpy <code>ndarray</code>,然后交换操作可以就地执行,而不是在副本中执行。</p>
<p>您可以直接在<code>byt</code>上执行相同的索引,例如</p>
<pre><code>byt[i] = byt[i+1]
</code></pre>
<p>但是,在numpy中使用显式类型获得缓冲数组的句柄通常会让您做更多的事情,特别是使用<code>bytearray</code>,它本身非常有限。</p>
<p>不过要小心。尽管在Python级别,<code>bytearray</code>表示无符号的8位整数值(0-255),但实际的底层C实现在<code>bytearrayobject.h</code>中使用纯的<code>char</code>作为字节值(<a href="https://stackoverflow.com/questions/35835785/does-python-bytearray-use-signed-integers-in-the-c-representation">see here for more info</a>)。如果对此使用numpy,则可能需要使用<code>dtype=numpy.ubyte</code>指定<code>frombuffer</code>的可选<code>dtype</code>参数。</p>
<pre><code>import numpy as np
byt = bytearray(range(256))
npbyt = np.frombuffer(byt, dtype=np.ubyte)
for i in range(0, len(npbyt)-1, 2):
temp = npbyt[i]
npbyt[i] = npbyt[i+1]
npbyt[i+1] = temp
print(list(byt))
</code></pre>
<p>它印出来了</p>
<pre><code>[1,
0,
3,
2,
5,
4,
...
255,
254]
</code></pre>
<p>我在处理一个名为<a href="https://github.com/spearsem/buffersort" rel="nofollow noreferrer">buffersort</a>的小型项目时遇到了其中的一些问题,该项目可以对实现可写缓冲区协议的Python对象执行就地排序,就像<code>bytearray</code>那样。</p>
<p>如果您对从那里获取Cython源代码感兴趣,那么有一个简单的helper函数<code>_swap</code>,它可以让您轻松地完成您想要的任务。不过,对于您的用例来说,这可能是非常过分的。</p>