gpt4 book ai didi

python - 与用零替换现有数组的值相比,为什么 Numpy 创建零数组要快得多?

转载 作者:行者123 更新时间:2023-12-02 18:47:16 26 4
gpt4 key购买 nike

我有一个数组,用于跟踪各种值。该数组的大小为 2500x1700,因此不是很大。在 session 结束时,我需要将该数组中的所有值重置为零。我尝试创建一个新的零数组并将数组中的所有值替换为零,并且创建一个全新的数组要快得多。

代码示例:

for _ in sessions:
# Reset our array
tracking_array[:,:] = 0

1.44 s ± 19.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

对比

for _ in sessions:
# Reset our array
tracking_array = np.zeros(shape=(2500, 1700))

7.26 ms ± 133 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

与仅替换数组中的值相比,为什么创建一个全新的数组要快得多?

最佳答案

原因是主流操作系统(Windows、Linux、MaxOS)数组未填入内存。 Numpy 通过向操作系统 (OS) 请求虚拟内存 中的零填充区域来分配一个零填充数组。该区域不直接映射到物理 RAM 中。当您在虚拟内存中读取/写入页面时,映射和零初始化通常由操作系统延迟完成。例如,当您稍后将数组设置为 1 时,将支付此费用。这是一个证明:

In [19]: %timeit res = np.zeros(shape=(2500, 1700))
10.8 µs ± 118 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [20]: %timeit res = np.ones(shape=(2500, 1700))
7.54 ms ± 151 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

前者意味着 RAM 吞吐量至少为 4.2 GiB/s,虽然不高但很公平。后者意味着 RAM 吞吐量至少约为 2930 GiB/s,这太高了,因为我的机器(以及任何标准台式机/服务器机器)几乎无法达到 36 GiB/s(使用精心优化的基准) .

关于python - 与用零替换现有数组的值相比,为什么 Numpy 创建零数组要快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67270937/

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