在 NumPy 中,更大的数组创建得更快?
In NumPy, larger arrays are created more quickly?
正如时间建议的那样,这是缓存的东西吗?
In [55]: timeit a = zeros((10000, 400))
100 loops, best of 3: 3.11 ms per loop
In [56]: timeit a = zeros((10000, 500))
The slowest run took 13.43 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.43 µs per loop
试图愚弄它,但没有成功:
In [58]: timeit a = zeros((10000, 500+random.randint(100)))
The slowest run took 13.31 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.35 µs per loop
原因不是缓存,而是 numpy 只是创建一个占位符而不是整个数组。当您执行以下操作时,可以通过监视您的 RAM 使用情况轻松验证这一点:
a = np.zeros((20000, 20000), np.float64)
这不会在我的计算机上分配 20k*20k*8byte ~ 3GB(但可能是 OS 相关的,因为 np.zeros
使用 C 函数 calloc
)。但要小心,因为对该数组的大多数操作(例如 a += 5
)将立即分配该内存!确保您使用的大小与您的 RAM 相比合适,这样您就会注意到 RAM 的增加而不会过度使用它。
最后这只是推迟了数组的分配,只要你对它进行操作,分配和操作的组合时间应该符合预期(与元素数量成线性关系)。看来你正在使用 IPython 所以你可以使用 block-timeit %%timeit
:
%%timeit
a = np.zeros((10000, 400))
a += 10
# => 10 loops, best of 3: 30.3 ms per loop
%%timeit
a = np.zeros((10000, 800))
a += 10
# => 10 loops, best of 3: 60.2 ms per loop
正如时间建议的那样,这是缓存的东西吗?
In [55]: timeit a = zeros((10000, 400))
100 loops, best of 3: 3.11 ms per loop
In [56]: timeit a = zeros((10000, 500))
The slowest run took 13.43 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.43 µs per loop
试图愚弄它,但没有成功:
In [58]: timeit a = zeros((10000, 500+random.randint(100)))
The slowest run took 13.31 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.35 µs per loop
原因不是缓存,而是 numpy 只是创建一个占位符而不是整个数组。当您执行以下操作时,可以通过监视您的 RAM 使用情况轻松验证这一点:
a = np.zeros((20000, 20000), np.float64)
这不会在我的计算机上分配 20k*20k*8byte ~ 3GB(但可能是 OS 相关的,因为 np.zeros
使用 C 函数 calloc
)。但要小心,因为对该数组的大多数操作(例如 a += 5
)将立即分配该内存!确保您使用的大小与您的 RAM 相比合适,这样您就会注意到 RAM 的增加而不会过度使用它。
最后这只是推迟了数组的分配,只要你对它进行操作,分配和操作的组合时间应该符合预期(与元素数量成线性关系)。看来你正在使用 IPython 所以你可以使用 block-timeit %%timeit
:
%%timeit
a = np.zeros((10000, 400))
a += 10
# => 10 loops, best of 3: 30.3 ms per loop
%%timeit
a = np.zeros((10000, 800))
a += 10
# => 10 loops, best of 3: 60.2 ms per loop