【问题标题】:Markedly faster to access a numpy array 'arr' than 'arr[:]'访问 numpy 数组 'arr' 的速度明显快于 'arr[:]'
【发布时间】:2017-05-24 23:08:24
【问题描述】:

在以下场景中,为什么访问arr 比访问arr[:]arr[::] 明显快。

In [1]: import numpy as np

In [2]: arr = np.random.randint(0, 255, (512, 512))

In [3]: %timeit arr
30.8 ns ± 2.43 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [4]: %timeit arr[:]
204 ns ± 0.588 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %timeit arr[::]
204 ns ± 1.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [8]: np.all(arr == arr[:])
Out[8]: True

In [9]: np.all(arr == arr[::])
Out[9]: True

上述所有方法不都是访问内存中连续的元素块吗?访问内存中的不连续块arr[::2]arr[:] 慢,但与aa[:] 之间的差异相比只有一点点。

In [10]: %timeit arr[::2]
221 ns ± 2.96 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:

    arrarr[:] 都没有真正访问数组的缓冲区。 arr 仅加载对数组的引用,而 arr[:] 构造由同一缓冲区支持的新对象。 arr[:] 的成本要高得多,与创建对象有关,但它实际上仍然没有对后备缓冲区做任何事情。

    【讨论】:

    • 您的评论也适用于arr[::2]。由于解析索引的额外工作,这会更慢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2011-11-14
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2017-11-06
    • 2020-07-10
    相关资源
    最近更新 更多