3. While 1比While True快?
首先来看一个比较while 1和while True循环的脚本,两个函数中,除了1和True的区别之外,其他地方完全相同。
import timeit
def while_one():
i = 0
while 1:
i += 1
if i == 10000000:
break
def while_true():
i = 0
while True:
i += 1
if i == 10000000:
break
if __name__ == '__main__':
wone = timeit.timeit(while_one,"from __main__ import while_one",number=3)
wt = timeit.timeit(while_true,"from __main__ import while_true",number=3)
print "while_one: %s\nwhile_true: %s" % (wone,wt)
4. if x == True: 还是 if x:
在PEP285中,还提到了这两种写法的比较。PEP285中认为,==具有传递性,a==b, b==c会被化简为a==c。也就是说,如果选择前一种写法的话,6和7在if语句中都应该被认为是真值,那么就会造成6==True==7,被化简为6==7的问题,因此后一种写法才是正确的。
现在,让我们偏个题,假设x就是True,那么程序的执行效率又如何呢?
import timeit
def if_x_equal_true():
x = True
if x == True:
pass
def if_x():
x = True
if x:
pass
if __name__ == "__main__":
if1 = timeit.timeit(if_x_equal_true,"from __main__ import if_x_equal_true",number = 1000000)
if2 = timeit.timeit(if_x,"from __main__ import if_x",number = 1000000)
print "if_x_equal_true: %s\nif_x: %s" % (if1,if2)
执行结果:
if_x_equal_true: 0.127066850662
if_x: 0.0872008800507
可以清晰的看到第9行比第14行,多出了检查True值和进行比较的操作。 也就是说,不论从遵循PEP的规范,还是执行效率,或者程序的简洁性来说,我们都应该使用if x:,而不是if x == True:来进行比较。同理,那些if x is not None:之类的语句也应当被简化为if x:(如果要比较的是非值,而不必须是None的话)。