我试图优化一段代码,该代码在循环中重复调用的函数内有分配。我使用jupyter运行了一些性能测试,结果对我来说是违反直觉的。
给定数组
A
,
B
,我将在循环中执行这两个的矩阵乘法。
-
方法1将没有预分配,结果将存储在
C
,
-
方法2将有一个预分配的数组
D
,其中存储了乘法结果
import numpy as np
A = np.random.rand(10, 10)
B = np.random.rand(10, 10000)
D = np.random.rand(10, 10000)
# Approach 1, no pre-allocation
for i in range(20000):
C = A @ B
# Approach 2, pre-allocated D
for i in range(20000):
D[:] = A @ B
我预计第二种方法会更快,因为它重用了D中的内存,而不是每次分配一个新的数组。然而,对循环进行计时表明,第一种方法实际上快了2倍。
为什么原地赋值(D[:]=A@B)比创建新数组(C=A@B)慢?这与numpy的内存管理有关吗?