while 1还是 while True?

运行速度,关键字,

Posted by UlyC on April 1, 2018

如果你把无知隐藏起来,没人可以伤害你
但你也学不到任何东西。

我的博客

while 1

while 1 是一个无限循环。
while ture在Python3中与之相同,在Python2中while 1 会更快。

由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值,这就导致程序在每次循环时都需要对True/False的值进行检查。

>>> True = 5
>>> True == 5
True

而对于1,则被程序进行了优化,而后不会再进行检查。

而在Python3中,由于True/False已经是关键字了,不允许进行重新赋值,因此,其执行结果与while 1不再有区别。

由于python2还在被广泛使用中,所以建议统一使用while 1提升性能。

>>> import timeit
>>>
>>>
>>> def while_one():
...     i = 0
...     while 1:
...         i += 1
...         if i == 1000000:
...             break
...
>>>
>>> def while_true():
...     i = 0
...     while True:
...         i += 1
...         if i == 1000000:
...             break
...
>>>
>>> time1 = timeit.timeit(while_one, number=3)
>>> time2 = timeit.timeit(while_true, number=3)
>>> print("while one: %s\nwhile_true: %s" % (time1, time2))

while one: 0.18305241497    # in python2
while_true: 0.259429785424   #  in python2

while one: 0.24419935399782844  # in python3
while_true: 0.20986851999623468   # in python3

True + True = 2

python中bool是int的子类,因此为了保证向下兼容性,在进行算术运算中,True/False会被当作int值来执行。

>>> True + True
2
>>> True - True
0
>>> True * True
1
>>> (True + True) > 1
True
>>> True + 5
6
>>> 1 / False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

if x == True还是 if x

在PEP285中,还提到了这两种写法的比较。PEP285中认为,==具有传递性,a==b, b==c会被化简为a==c。 也就是说,如果选择前一种写法的话,6和7在if语句中都应该被认为是真值,那么就会造成6==True==7,被化简为6==7的问题,因此后一种写法才是正确的。

if x == True会比if x多出检查True值和进行比较的操作。

也就是说,不论从遵循PEP的规范,还是执行效率,或者程序的简洁性来说,我们都应该使用if x 而不是if x == True来进行比较。

参考文章

  1. while (1) Vs. for while(True) — Why is there a difference?
  2. Python天坑系列(一):while 1比while True更快?

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。