python - 执行循环的时间突然增加

时间:2011-08-06 23:27:14

标签: python loops time function-calls

我有一些小软件可以计算每个三角形数的因子数,看看它们中第一个有多于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

我认为,如果我继续,我会遇到系统调用增加和时间突然增加的其他点,之前有类似的点但是时间太小所以它没那么重要..为什么函数调用突然增加??是不是只想再次为新值调用函数?

P.S。我使用cProfile作为分析器,这里代码中的X仅用于演示,我直接在代码中写入值...提前谢谢...

2 个答案:

答案 0 :(得分:6)

你看过所涉及的实际价值吗?

第一个超过47个因子的三角数是T(104)= 5460,有48个因子。

但是第一个超过48个因子的三角数是T(224)= 25200,其中有90个因子。所以难怪它需要做更多的工作。

如果你的代码最多运行到T( n ),那么它会调用range 2 n 次并且fac n < / em>次,总共3个 n个函数调用。因此,对于T(104),它需要312个函数调用,而对于T(224),它需要672个函数调用。据推测,在某个地方有2个函数调用,你没有向我们展示,这解释了你得到的分析结果。


您当前的策略不会让您找到Project Euler问题的答案。但我可以给出一些提示。

  • 每次计算三角数时,是否需要重新开始summ=0
  • 你是否必须将所有数字循环到 n 才能算出它有多少除数?有没有更快的方法? (2 16 = 65536有多少除数?你需要遍历从1到65536的所有数字吗?)
  • 三角数有多少除数? (查看一些可以计算答案的小三角数字。)你能看到任何可以帮助你计算更大三角数的答案的模式吗?

答案 1 :(得分:3)

如果你检查输出,你会看到执行时间有几个尖峰(突然增加)。

原因是所需的循环次数不是逐渐增加而是突然增加。在n循环后打印出while True,您就会看到它。

注意:Euler是数学网站,不写蛮力算法;)