在python中使用while循环是否是最好的做法?

时间:2012-01-15 02:09:22

标签: python for-loop while-loop repeat itertools

我正在做一些python基准测试,我发现repeat(None)while Truewhile 1快得多:

>>> def bench7():
...   foo = 0
...   a = time()
...   for i in repeat(None):
...     foo += 1
...     if foo == 100000000:
...       break
...   b = time()
...   print a, b, b-a
... 
>>> def bench8():
...   foo = 0
...   a = time()
...   while True:
...     foo += 1
...     if foo == 100000000:
...       break
...   b = time()
...   print a, b, b-a
... 
>>> bench7()
1326592924.41 1326592935.42 11.0051281452
>>> bench7()
1326592936.36 1326592947.48 11.1183578968
>>> bench8()
1326592951.47 1326592965.03 13.5640599728
>>> bench8()
1326592966.07 1326592979.6 13.5341670513`

while循环的这种用法是我在循环时实际使用的最后一件事。我有什么理由可以使用我忽视的东西吗?

3 个答案:

答案 0 :(得分:8)

由于while True的全局查找,True速度较慢。如果你改用while 1,那么while循环应该轻松击败for-repeat(至少在速度,美感和清晰度方面):

>>> from dis import dis
>>> def f():
        while True:
            print

>>> dis(f)
  2           0 SETUP_LOOP              11 (to 14)
        >>    3 LOAD_GLOBAL              0 (True)
              6 POP_JUMP_IF_FALSE       13
  3           9 PRINT_NEWLINE       
             10 JUMP_ABSOLUTE            3
        >>   13 POP_BLOCK           
        >>   14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        

>>> def g():
        while 1:
            print

>>> dis(g)
  2           0 SETUP_LOOP               4 (to 7)
  3     >>    3 PRINT_NEWLINE       
              4 JUMP_ABSOLUTE            3
        >>    7 LOAD_CONST               0 (None)
             10 RETURN_VALUE    

repeat 的主要用例是向 imap izip 提供常量值流。例如,以下计算二次幂的总和:sum(imap(pow, repeat(2), xrange(10)))

repeat itertool也可用于加速不需要更改变量的for循环。例如,Guido使用这种技术来最小化 timeit 模块中的循环开销:http://hg.python.org/cpython/file/40e1be1e0707/Lib/timeit.py#l188

要回答您的其他问题,“有没有理由使用while循环”。答案是肯定的。 Python的for循环实际上是一个使用迭代器来生成值流的foreach。相反,while循环要么是无界的(如在while-True示例中),要么在满足特定条件时终止(例如,循环用户输入直到用户键入“quit”或某些东西)。

while循环和for循环的对比功能可以在Collatz conjecture的例子中看到,其中while循环不能用for循环替换:

def collatz(n):
    print n
    while n > 1:
        n = n // 2 if n % 2 == 0 else n * 3 + 1
        print n

通过grepping Python's standard library可以看到更多的while循环示例和用例。

总之,while语句是工具包的重要组成部分: - )

答案 1 :(得分:1)

while循环允许进行真值测试。

while x < y:

这可能是为什么它比重复慢?

答案 2 :(得分:-1)

repeat(None)while True快,但不是while 1,因为while True会触发查找GLOBAL变量Truewhile 1repeat(None)快约14%。