我被一个感兴趣的博客文章由Mike槎他比较需要两个函数的时间numpy.zeros((N,N))和numpy.empty((N,N))为N=200和N=1000。我使用%timeit魔法在 jupyter notebook 中运行了一个小循环。下面的图表给出的所需要的时间之比numpy.zero来numpy.empty。对于N=346,numpy.zero比 慢大约 125 倍numpy.empty。在N=361及以上,这两个功能所需的时间几乎相同。
后来,在 Twitter 上的讨论导致了这样的假设:要么numpy为小分配做一些特殊的事情以避免malloc调用,要么操作系统可能会主动将分配的内存页面清零。
造成这种差异的原因是什么N,而较大的所需时间几乎相等N?
通过启动堆溢出编辑:我可以重现它(这就是为什么我来到这里的第1名),这里有一个情节np.zeros和np.empty独立。该比率看起来像 GertVdE 的原始图:
在 Python 3.9.0 64 位、NumPy 1.19.2、Windows 10 Pro 2004 64 位上完成,使用此脚本生成数据:
from timeit import repeat
import numpy as np
funcs = np.zeros, np.empty
number = 10
index = …Run Code Online (Sandbox Code Playgroud) 我有一个用于跟踪各种值的数组。数组的2500x1700大小,所以不是很大。在会话结束时,我需要将该数组中的所有值重置为零。我尝试创建一个新的零数组并将数组中的所有值替换为零,并且创建一个全新的数组要快得多。
代码示例:
\nfor _ in sessions:\n # Reset our array\n tracking_array[:,:] = 0\n\n1.44 s \xc2\xb1 19.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nRun Code Online (Sandbox Code Playgroud)\n相对
\nfor _ in sessions:\n # Reset our array\n tracking_array = np.zeros(shape=(2500, 1700))\n\n7.26 ms \xc2\xb1 133 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\nRun Code Online (Sandbox Code Playgroud)\n与仅替换数组中的值相比,为什么创建全新的数组要快得多?
\n