Omn*_*ity 4 python for-loop repeat while-loop python-itertools
我正在做一些python基准测试,我发现它repeat(None)比while True或者快得多while 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`
Run Code Online (Sandbox Code Playgroud)
while循环的这种用法是我在循环时实际使用的最后一件事.有什么理由可以使用而我正在俯瞰吗?
的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
Run Code Online (Sandbox Code Playgroud)
重复的主要用例是向imap或izip提供常量值流.例如,以下计算二次幂的总和: 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示例中),要么在满足特定条件时终止(例如,循环用户输入直到用户输入"quit"或某些东西).
在Collatz猜想的例子中可以看到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
Run Code Online (Sandbox Code Playgroud)
通过grepping Python的标准库,可以看到更多的while循环示例和用例.
总之,while语句是工具包的重要组成部分:-)