使用memoryview(Python 3.5.0)进行切片分配
我有一个大的bytearray x,想把它的一个片段分配给另一个bytearray的片段使用memoryview(Python 3.5.0)进行切片分配,python,python-3.5,memoryview,Python,Python 3.5,Memoryview,我有一个大的bytearray x,想把它的一个片段分配给另一个bytearray的片段 x = bytearray(10**7) #something else in practice y = bytearray(6*10**6) y[::6] = x[:2*10**6:2] 我想使用memoryview会更快,而且 memoryview(x)[:2*10**6:2] 速度非常快。但是, y[::6] = memoryview(x)[:2*10**6:2] 当y[:6]=x[:2*10*
x = bytearray(10**7) #something else in practice
y = bytearray(6*10**6)
y[::6] = x[:2*10**6:2]
我想使用memoryview会更快,而且
memoryview(x)[:2*10**6:2]
速度非常快。但是,
y[::6] = memoryview(x)[:2*10**6:2]
当y[:6]=x[:2*10**6:2]
减速并不是一个bug,但是
memoryview
和缓冲区协议仍然相对较新,并且没有得到很好的优化。y[::6]=memoryview(x)[:2*10**6:2]
的底层代码在复制bytearray
之前创建一个连续副本。这意味着它将比直接创建和分配bytearray
的正常切片慢。事实上,在这个特定的例子中(在我的机器上),使用内存视图
比直接赋值在速度上更接近使用y[::6]=islice(x,None,2*10**6,2)
numpy
存在的时间更长,并且针对您感兴趣的操作类型进行了更好的优化
使用ipython:
In [1]: import numpy as np; from itertools import islice
In [2]: x = bytearray(10**7)
In [3]: y = bytearray(6*10**6)
In [4]: x_np = np.array(x)
In [5]: y_np = np.array(y)
In [6]: %timeit y[::6] = memoryview(x)[:2*10**6:2]
100 loops, best of 3: 10.9 ms per loop
In [7]: %timeit y[::6] = x[:2*10**6:2]
1000 loops, best of 3: 1.65 ms per loop
In [8]: %timeit y[::6] = islice(x, None, 2*10**6, 2)
10 loops, best of 3: 22.9 ms per loop
In [9]: %timeit y_np[::6] = x_np[:2*10**6:2]
1000 loops, best of 3: 911 µs per loop
最后两种方法的额外好处是内存开销非常小。我将研究使用numpy在大型数值阵列上进行快速操作。