gpt4 book ai didi

python - 为什么在 sympy 中使用无穷大 (oo) 比提供整数上限更快?

转载 作者:行者123 更新时间:2023-12-01 02:53:35 25 4
gpt4 key购买 nike

考虑以下示例代码 ( Repl.it ):

from sympy import *;
import time;

k = symbols('k', integer = True);

start = time.time();
s_a = float(summation((pow(-1,(k+1))/k) * (pow((4.0/5.0),(k+1))), (k,1,oo)));
print("Result: " + str(s_a) + ". Time to compute - " + str(time.time() - start) + " seconds")

N = 1000;
start = time.time();
s_b = float(summation((pow(-1,(k+1))/k) * (pow((4.0/5.0),(k+1))), (k,1,N)));
print("Result: " + str(s_b) + ". Time to compute: " + str(time.time() - start) + " seconds")

输出为:

Result: 0.470229331921695.  Time to compute: 0.371837854385376 seconds
Result: 0.470229331921696. Time to compute: 1.1281118392944336 seconds

为什么在上面的示例中使用范围 1 到 ∞ 时的执行时间明显快于使用范围 1 到 1000 时的执行时间?

最佳答案

您想要计算的无限级数本质上是 mercator series或第一个polylogarithm 。SymPy 知道并使用该分析结果。如果替换 4.0/5.0,您也可以看到这一点通过Rational(4,5)并删除 float转换,在这种情况下您将获得 -4*log(5)/5 + 4*log(9)/5无限总和(可以简化为 4/5*log(9/5) )。

相比之下,截断的序列没有分析结果(总和为 N ),这就是为什么 SymPy 必须实际对所有被加数进行数字相加,这需要更长的时间。

为了完整起见,需要注意的是,当您转换为float时,需要对对数进行数值计算,这又happens through some truncated power series or similar ,但在这种情况下,求和发生在高度优化的编译代码中,而不是 Python 中。

关于python - 为什么在 sympy 中使用无穷大 (oo) 比提供整数上限更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com