【发布时间】:2015-11-24 08:40:09
【问题描述】:
如果有人可以向我解释为什么下面的代码有这么多额外的开销,我会很高兴。在 100k 次迭代中,任何一种情况的速度都相同(2.2 秒)。当增加到 1E6 次迭代时,案例“B”永远不会完成,而案例“A”只需要 29 秒。
案例“A”
while n is not 1:
foo
案例“B”
while n > 1:
foo
如果有任何帮助,请完成代码
def coll(n):
count = 0
# while n is not 1:
while n > 1:
count += 1
if not n % 2:
n /= 2
else:
n = 3*n + 1
return count
for x in range(1,100000):
count = coll(x)
【问题讨论】:
-
对我来说,100,000 次迭代的两个版本都在 1 秒内运行。对于 1,000,000 次迭代,B 在大约 11 秒内运行,而 A 仍在运行。
-
构造
n is not 1无论如何都不等同于n > 1。第一种形式不是算术比较,不应使用。is not 1是关于对象身份的声明,完全依赖于实现。即n != 1不一定等同于n is not 1。如果你使用未定义的行为,你的程序可以做它想做的任何事情,所以不要这样做。 -
艾伦,你确定你的意思是 B 永远不会结束吗?
-
对不起,我的意思是“永远不会完成我的意思是我让程序运行了 20 分钟而没有完成,所以我不得不终止它。我发现 IS NOT 导致我的脚本挂起,并将其替换为 !=.
标签: python performance while-loop overhead