gpt4 book ai didi

python - 使用内存 View (Python 3.5.0)的切片分配速度较慢

转载 作者:太空宇宙 更新时间:2023-11-04 05:43:26 26 4
gpt4 key购买 nike

我有一个大的字节数组 x 并想将它的一部分分配给另一个字节数组 y 的一部分

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] 的 5 倍

  1. 我是不是遗漏了什么,或者这种减速是 Python 中的一个错误?
  2. 在 Python 中执行此操作的最快方法是 (a) 如果我想重复分配已知数量的 0,以及 (b) 通常情况下?

最佳答案

减速并不是一个错误,而是 memoryview 和缓冲协议(protocol)仍然相对较新并且优化不佳。 y[::6] = memoryview(x)[:2*10**6:2] 的底层代码在复制之前创建了 bytearray 的连续副本超过。这意味着它比直接创建和分配 bytearray 的普通切片要慢。实际上,在这个特定实例中(在我的机器上),使用 memoryview 的速度更接近于使用 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

后两者的额外好处是内存开销非常小。

关于python - 使用内存 View (Python 3.5.0)的切片分配速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33093736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com