Python while循环速度
Python while loop speed
我希望有人能向我解释为什么以下代码有如此多的额外开销。在 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)
一般在Python中,is
检查起来非常快,因为它使用了引用相等,所以只需要检查两个对象是否有相同的内存位置。请注意,您的代码有效的唯一原因是 Python 的大多数实现通常维护一个较小整数池,因此每个 1
总是指相同的 1
,例如,其中可能有多个对象代表 1000
。在这些情况下,n is 1000
会失败,而 n == 1000
会起作用。您的代码依赖于此整数池,这是有风险的。
>
涉及一个函数调用,在Python中相当慢:n > 1
转换为n.__gt__(1)
。
首先,你应该使用n > 1
或n != 1
,而不是n is not 1
。后者有效的事实是一个实现细节,显然它不适合你。
它不起作用的原因是因为您的代码中有 x
的值导致 Collatz 序列超过 sys.maxint
的值,从而将 n
变成long
。然后,即使它最终回到 1
,它实际上是 1L
; long
,而不是 int
.
尝试使用 while n is not 1 and repr(n) != '1L':
,它将如您所愿地工作。但是不要那样做;只需使用 n > 1
或 n != 1
.
我希望有人能向我解释为什么以下代码有如此多的额外开销。在 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)
一般在Python中,is
检查起来非常快,因为它使用了引用相等,所以只需要检查两个对象是否有相同的内存位置。请注意,您的代码有效的唯一原因是 Python 的大多数实现通常维护一个较小整数池,因此每个 1
总是指相同的 1
,例如,其中可能有多个对象代表 1000
。在这些情况下,n is 1000
会失败,而 n == 1000
会起作用。您的代码依赖于此整数池,这是有风险的。
>
涉及一个函数调用,在Python中相当慢:n > 1
转换为n.__gt__(1)
。
首先,你应该使用n > 1
或n != 1
,而不是n is not 1
。后者有效的事实是一个实现细节,显然它不适合你。
它不起作用的原因是因为您的代码中有 x
的值导致 Collatz 序列超过 sys.maxint
的值,从而将 n
变成long
。然后,即使它最终回到 1
,它实际上是 1L
; long
,而不是 int
.
尝试使用 while n is not 1 and repr(n) != '1L':
,它将如您所愿地工作。但是不要那样做;只需使用 n > 1
或 n != 1
.