python – 执行循环的时间突然增加
作者:互联网
我有一些小软件可以计算每个三角形数的因子数,看看它们中的第一个有多于X个因子是什么(是的,这是一个项目问题,number 12,虽然我没有解决它…当我尝试使X一些随机值来查看代码的作用以及在多长时间内,我注意到一些奇怪的东西(至少对我来说):直到X = 47,执行时间以明显正常的方式增加,但是当X = 48时,它比正常情况增加得更多,而且函数调用远远大于速率,它(爆炸),如果我会说…为什么会这样做?
代码:
def fac(n):
c=0
for i in range (1,n+1):
if n%i==0:
c=c+1
return c
n=1
while True:
summ=0
for i in range (1,n+1):
summ=summ+i
if fac(summ)>X:
break
n=n+1
print summ
并在分析时:
when X=45 : 314 function calls in 0.027 CPU seconds
when X=46 : 314 function calls in 0.026 CPU seconds
when X=47 : 314 function calls in 0.026 CPU seconds
when X=48 : 674 function calls in 0.233 CPU seconds
when X=49 : 674 function calls in 0.237 CPU seconds
我假设如果我继续,我会遇到系统调用增加和时间突然增加的其他点,之前有类似的点但是时间太小所以它没那么重要..为什么函数调用突然增加?是不是只想再次为新值调用函数?
附:我使用cProfile作为分析器,这里的代码中的X仅用于演示,我直接在代码中写入值…提前谢谢…
解决方法:
你看过所涉及的实际价值吗?
具有超过47个因子的第一个三角形数是T(104)= 5460,其具有48个因子.
但是具有超过48个因子的第一个三角形数字是T(224)= 25200,其具有90个因子.所以难怪需要做更多的工作.
如果你的代码运行到T(n),那么它调用范围2n次和次n次,总共3n次函数调用.因此,对于T(104),它需要312个函数调用,而对于T(224),它需要672个函数调用.据推测,在某个地方有2个函数调用,你没有向我们展示,这解释了你得到的分析结果.
您当前的策略不会让您找到Project Euler问题的答案.但我可以给出一些提示.
>每次计算三角数时,是否必须重新使用summ = 0?
>你是否必须将所有数字循环到n以便计算它有多少除数?有没有更快的方法? (216 = 65536有多少除数?你需要遍历从1到65536的所有数字吗?)
>三角数有多少除数? (查看一些可以计算答案的小三角数字.)你能看到任何可以帮助你计算更大三角数的答案的模式吗?
标签:python,loops,time,function-calls 来源: https://codeday.me/bug/20190723/1515430.html