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)
观察:问题是:
最佳答案
正如几条评论所指出的,这完全是关于 locality of reference .想一想 numpy 在低级必须做什么,以及在第 3 种情况下连续左值在内存中彼此相距多远。
另请注意,当数组不是 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)
(非常小的旁注:出于同样的原因,有时在对组进行 DataFrame
和一系列重复操作之前对 groupby
进行排序是有利的,这有点违反直觉,因为排序本身需要 O(nlogn)
)。
关于python - 为什么对 numpy 数组的就地修改性能与被修改的维度顺序有关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65454168/