【发布时间】:2021-03-30 11:49:16
【问题描述】:
下面的代码是定义函数从下限 2 的总和,我改变总和的上限,因为我想找出总和收敛的位置。我发现上限越大,代码运行越慢。对于任何较大的上限值,如何使此代码快速运行?代码如下:
def h(i):
x = (-1)**(i+1)
y = 1000000000-(i-1)
z = (log(i))**20
return x*y*z
gx = sum(h(i) for i in range (2, 1000000000+1))
d_gx = gx/1000000000
print(d_gx)
【问题讨论】:
-
首先你可以通过使用
x = (i%2 == 0) ? -1 : 1来避免h(i)中的乘法。我想这不会提高很多性能,但这是一件小事。另外,什么需要时间?对i的大值求和或计算h(i)? -
发布实际表现也会有所帮助。例如,您可以在 IPython 控制台中使用
%timeit魔法。 -
如果你不能进行一些公式优化,这里没有任何帮助;您遇到与 n 成正比的运行时问题。虽然您可以减少常数因子,但对于 12 位数字,效果是有限的。
-
Numba 将在这里为您提供很多帮助。尤其是矢量化。范围内的循环会很慢。
标签: python sum series infinite convergence