【发布时间】:2017-09-28 10:35:45
【问题描述】:
我正在为学校做作业,我应该安排一个集成函数的 python 实现和一个相同的 numpy 实现。我通常希望 numpy 比 python 实现执行得更好,但事实并非如此。与 numpy 数组相比,我在 python 中使用列表理解的速度大约是 4 倍。从 N=1000 到 N=100 000 都是如此。还没有测试过更高的值,因为 N=100 000 是我需要达到的估计误差。
常规python代码:
f 是要积分的函数,a 和 b 是极限,N 是要积分的点数
def integrate(f, a, b, N):
x_val = [a + (i*b) / N for i in range(N+1)]
return sum([f(x_val[i]) * (x_val[i] - x_val[i-1]) for i in range(1, len(x_val))])
Numpy 代码:
def numpy_integrate(f, a, b, N):
x_val = numpy.zeros(N+1)
x_val[0] = a
res = 0
for i in numpy.arange(1, len(x_val)):
x_val[i] = a + (i*b)/N
res += f(x_val[i]) * (x_val[i] - x_val[i - 1])
return res
可能是我的 numpy 实现出现了严重错误,或者在这种规模下,常规的列表理解速度快得多?
【问题讨论】:
-
在使用 numpy 时不应该使用循环。
-
好的,那么你将如何重写计算以不使用循环?