5

我正在做一些 python 基准测试,我发现它比orrepeat(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 循环的这种用法是我实际使用 while 循环的最后一件事。有什么理由可以使用我忽略的时间吗?

4

3 回答 3

9

while True只是因为全局查找True. 如果你改用while 1while 循环,应该可以轻松击败 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提供常量值流。例如,以下计算二次幂的总和: 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 循环要么是无界的(如 while-True 示例中所示),要么在满足特定条件时终止(例如,循环用户输入直到用户键入“退出”或类似的内容)。

在Collat​​z 猜想的例子中可以看到 while 循环和 for 循环的对比能力,其中 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 的标准库,可以看到更多 while 循环的示例和用例。

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

于 2012-01-15T03:08:20.717 回答
1

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

while x < y:

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

于 2012-01-15T02:18:31.823 回答
0

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

于 2012-01-15T09:38:23.510 回答