我在做一些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循环。还有什么理由可以用我忽略的东西吗?在
由于对
True
的全局查找,while True
的速度较慢。如果使用while 1
,while循环应该轻松地击败for repeat(至少在速度、美观和清晰度方面):repeat的主要用例是向imap或izip提供一个常量值流。例如,下面计算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语句是工具箱的重要组成部分:-)
而循环允许真值测试。在
有没有可能这就是为什么它比重复慢?在
repeat(None)
比while True
快,但不是while 1
,因为while True
触发全局变量{while 1
比repeat(None)
快14%。在相关问题 更多 >
编程相关推荐