gpt4 book ai didi

python - 为什么对 numpy 数组的就地修改性能与被修改的维度顺序有关?

转载 作者:行者123 更新时间:2023-12-04 13:30:18 26 4
gpt4 key购买 nike

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)
观察:
  • 上述三个运行的性能不同:修改第 1 和第 3 维(切片第 2 维)是三者中最快的,而修改第 1 和第 2 维(切片第 3 维)是最慢的。
  • 速度 w.r.t. 似乎没有单调性。被切片的维度。

  • 问题是:
  • numpy 背后的什么机制引起了我的观察?
  • 考虑到第一个问题的答案,如何通过正确排列尺寸来加速我的代码,因为一些尺寸被批量修改而其余的只是被切片?
  • 最佳答案

    正如几条评论所指出的,这完全是关于 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/

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