在python中,使用while循环是最佳实践吗?

2024-10-04 11:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一些python基准测试,发现repeat(None)while True或{}快得多:

>>> 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循环的用法是我最后一次使用while循环。还有什么理由可以用我忽略的东西吗?在


Tags: innonetrueforiffootimedef
3条回答

由于对True的全局查找,while 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的主要用例是向imapizip提供一个常量值流。例如,下面计算2的幂和:sum(imap(pow, repeat(2), xrange(10)))。在

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

为了回答你的另一个问题,“有什么理由使用while循环?”。答案是肯定的。Python的for循环实际上是一个foreach,它使用迭代器生成一个值流。相反,while循环要么是无界的(如whiletrue示例中所示),要么是在满足特定条件时终止的(例如,循环用户输入,直到用户键入“quit”或类似的东西为止)。在

while循环和for循环的对比功能可以在Collatz conjecture的示例中看到,其中while循环不能很容易地替换为for循环:

^{pr2}$

通过对Python's standard library进行greping,可以看到while循环的更多示例和用例。在

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

而循环允许真值测试。在

while x < y:

有没有可能这就是为什么它比重复慢?在

repeat(None)while True快,但不是while 1,因为while True触发全局变量{}的查找。 while 1repeat(None)快14%。在

相关问题 更多 >