【发布时间】:2022-02-07 20:02:03
【问题描述】:
做了一些测试,我注意到我编写的自定义循环函数可能比 NumPy 内置函数 np.cumprod() 更快。我不认为这是可能的,有人可以解释发生了什么吗?
import time
import numpy as np
def custom_cumprod(x):
xb = [1]
for xi in x:
xb.append(xb[-1]*xi)
return np.array(xb[1:])
x = np.random.random((10000, 10000))
t0 = time.time()
b = custom_cumprod(x)
t1 = time.time()
print(t1-t0)
t0 = time.time()
c = np.cumprod(x,0)
t1 = time.time()
print(t1-t0)
print(np.sum(c-b))
谢谢!
【问题讨论】:
-
可能 NumPy 选择了一个效率较低的循环顺序。
-
您在内存不是contiguous 的轴上进行乘法运算。比较
np.cumprod(x.T, 0) -
我检查了您的测试,发现内部 cumprod 使用的内存明显减少。我想这是选择了更节省内存的方法,但它是以速度为代价的。
-
我过去问过类似的问题。简而言之,(1)
np.cumprod(x, 1)由于内存布局会更快,(2)你的数据太大了,你基本上测试了你的电脑的内存效率 - 100x100 numpy 应该更快。