[英]Why is performance of in-place modification to a numpy array related to the order of dimension being modified?
import numpy as np
a = np.random.random((500, 500, 500))
b = np.random.random((500, 500))
%timeit a[250, :, :] = b
%timeit a[:, 250, :] = b
%timeit a[:, :, 250] = b
107 µs ± 2.76 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
52 µs ± 88.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
1.59 ms ± 4.45 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
观察:
问题是:
正如一些评论所指出的那样,这完全与参考的位置有关。 想想 numpy 在底层要做些什么,在第三种情况下,memory 中的连续左值彼此相距多远。
另请注意,当数组不是 C 连续而是 F 连续时,计时结果如何变化:
a = np.asfortranarray(a)
b = np.asfortranarray(b)
%timeit a[250, :, :] = b
%timeit a[:, 250, :] = b
%timeit a[:, :, 250] = b
892 µs ± 22 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
169 µs ± 66.4 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
158 µs ± 24.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
(非常小的旁注:出于同样的原因,有时在对组进行groupby
和一堆重复操作之前对DataFrame
进行排序是有利的,这有点违反直觉,因为排序本身需要O(nlogn)
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.