从解释器的角度来看,numpy 数组是如何被覆盖的?

问题描述 投票:0回答:1

我编写了两个简单的函数来学习 CPython 关于 numpy 数组的行为。

Python 3.12.1 和 numpy 版本 1.26.2,由 mkl 编译(conda 默认)

def foo():
    for i in range(100):
        H = np.random.rand(1000, 1000)

%timeit -r 100 foo()

def baaz():
    H = np.zeros((1000, 1000))
    for i in range(100):
        H[:, :] = np.random.rand(1000, 1000)

%timeit -r 100 baaz()

最初,我认为 baaz() 应该比 foo() 运行得更快,因为我们重用 H 数组,而不是在每个循环上取消分配和再次分配 H。然而,我始终认为 foo() 更快。我想知道是什么原因造成的。我无法阅读汇编代码,但通过简单地查看 dis.dis(foo()) 和 dis.dis(baaz()) 输出,我可以看到 foo() 与 baaz() 相比生成了 13 行额外的行。

P.S:为什么人们会认为 baaz() 应该更快,这似乎并不明显,但在像 Julia 这样的语言中确实是这种情况理解 Julia 多线程/多进程设计

python numpy intel-mkl
1个回答
0
投票

两种情况下,当您执行

np.random.rand(1000, 1000)
时,您将创建一个新数组,然后取消分配它。在
baaz
的情况下,您还将完成更新初始数组的工作。因此速度较慢。

© www.soinside.com 2019 - 2024. All rights reserved.