【发布时间】:2011-08-06 23:27:13
【问题描述】:
我有一些小软件可以计算每个三角形数的因子数,以查看其中的第一个因子数超过 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作为profiler,这里代码中的X只是为了演示,我直接把值写在代码里...先谢谢大家了...
【问题讨论】:
-
我在问突然的性能差异是否可能是由于调用了垃圾收集器。我只是猜测。
-
@Chris:这里不能解释垃圾收集,因为 Python 的垃圾收集器 only runs when excess allocations exceed a threshold。这里给出的代码不会累积分配的数据,所以不会达到阈值,也不会调用收集器。
-
确实如此。整数是不可变的,因此
c=c+1语句确实会在内存中累积。不过我承认这是一个非常小的积累。我再说一遍:这是一个猜测。 -
@Chris:即使整数是不可变的,它们的内存仍然会被重用。
标签: python loops time function-calls