使用memoryview(Python 3.5.0)进行切片分配

使用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*

我有一个大的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**6:2]

  • 我是否遗漏了什么,或者这是Python中的一个bug
  • 在Python中,最快的方法是什么(a)如果我想重复分配已知数量的0,以及(b)一般情况下

  • 减速并不是一个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在大型数值阵列上进行快速操作。