Python天坑系列(一):while 1比while True更快?

转载 2015年04月20日 16:25:23


0. 前言

前些天被Python的多线程坑了一把,因此产生了写一个《Python天坑系列》博客的想法,说说我碰到的那些Python的坑。

而天坑这个词呢,一方面指Python的坑,另一方面也说明本系列文章也是个坑,对于会写什么内容、有多少篇、多久更新一次、什么时间更新我都无法确定,哈哈(看,之前已经3个月没有更新过了!)。

本篇是系列的第一篇,讲的内容是Python的bool类型。

1. 前提

1.1 bool是int的子类

根据PEP285中Review部分第6条所述,bool类是从int类继承而来的,这样可以极大的简化实现(C代码中调用PyInt_Check()的地方仍将继续工作)。

1.2 Python2中True/False不是关键字,但Python3中是

我们可以导入keyword模块,来查看关键字:

而在Python3中,关键字中添加了True/False/None。

由于Python2中True/False不是关键字,因此我们可以对其进行任意的赋值:

2. True + True = 2

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

3. While 1比While True快?

首先来看一个比较while 1和while True循环的脚本,两个函数中,除了1和True的区别之外,其他地方完全相同。

执行结果:
while one: 1.37000703812
while_true: 2.07638716698

可以看出wihle 1的执行时间约为while True的2/3。

那么,这是为什么呢?

其实这就是前提中提到的关键字的问题。由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值,这就导致程序在每次循环时都需要对True/False的值进行检查;而对于1,则被程序进行了优化,而后不会再进行检查。

我们可以通过dis模块来查看while_one和while_true的字节码,下面的程序是对刚才的程序进行了一定的简化后的版本。

执行的结果是:

可以看出,正如上面所讲到的,在while True的时候,字节码中多出了几行语句,正是这几行语句进行了True值的检查。

而在Python3中,由于True/False已经是关键字了,不允许进行重新赋值,因此,其执行结果与while 1不再有区别(好吧,我这没有Python3的环境,就不去验证了,网上有人验证过了)。但是由于Python2的使用十分广泛,因此大家不得不注意这个可能会降低性能的地方。

4. if x == True: 还是 if x:

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

现在,让我们偏个题,假设x就是True,那么程序的执行效率又如何呢?

执行结果是:
if_x_eq_true: 0.212558031082
if_x: 0.144327878952

让我们再来看看字节码(程序未作修改,dis的使用方式同上,因此不再给出程序):

可以清晰的看到第9行比第14行,多出了检查True值和进行比较的操作。

也就是说,不论从遵循PEP的规范,还是执行效率,或者程序的简洁性来说,我们都应该使用if x:,而不是if x == True:来进行比较。同理,那些if x is not None:之类的语句也应当被简化为if x:(如果要比较的是非值,而不必须是None的话)。

5. References

http://legacy.python.org/dev/peps/pep-0285/
http://stackoverflow.com/questions/3815359/while-1-vs-for-whiletrue-why-is-there-a-difference

本文内容遵从CC3.0版权协议,转载请注明:转自Pythoner

本文链接地址:Python天坑系列(一):while 1比while True更快?

Python淘宝美眉图片下载爬虫视频教程

-
  • 1970年01月01日 08:00

python学习——while True的用法

在学习过程中,经常能遇到采用while True的用法。下面以一个例子进行说明:建立一个用户登录系统,用户输入用户名和密码,如果正确就可以进入系统。1、我自己最开始的写法:d = {} ...
  • geerniya
  • geerniya
  • 2017-08-24 09:56:18
  • 8309

Python学习笔记(While循环)

和其他编程语言一样,Python同样提供并支持循环语句。循环语句允许我们执行一条或多条语句多次。 Python中提供的循环语句有for循环和while循环.while循环是指在给定的条件成立时(tr...
  • jun_life
  • jun_life
  • 2016-06-18 17:06:21
  • 19711

python2中为什么while 1比while True快

使用dis模块的dis()可以显示函数的字节码,它的参数可以是函数对象或者代码对象。 如果是函数对象>>> dis.dis(myfunc) 2 0 LOAD_GLOBAL ...
  • s969966195
  • s969966195
  • 2017-08-09 17:24:32
  • 248

流程控制-while和循环退出

一、循环退出 循环退出有以下几种: 1.continue 2.break 3.pass 4.sys.exit() 查看几个小例子来了解他们的作用 1.contiune例子: fo...
  • shuaizy2017
  • shuaizy2017
  • 2017-12-27 19:51:09
  • 291

while(true)循环与CPU占用率问题

之前写程序的时候一直没有主动注意CPU占用的问题,今天在进行RTSP服务端测试的时候发现只是接入了一两个连接,CPU的占用率已经达到了100%,吓死我了~虽然之前已经预料到CPU占用会很高,但实际测试...
  • xiaoyu90520
  • xiaoyu90520
  • 2013-07-18 16:00:46
  • 3721

Python 3语法小记(六)条件、循环和assert、pass、del

条件: if 条件:     语句块 elif:     语句块 else:     语句块 elif 表示 else if 这居然是合法的!!!1 >>> if 1 < x < 2: p...
  • jcjc918
  • jcjc918
  • 2013-08-01 13:06:42
  • 11336

Python中pass的作用

空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/java中:if(true) ; //do nothing else { //do someth...
  • violet_echo_0908
  • violet_echo_0908
  • 2016-07-28 09:37:13
  • 14027

python中pass语句学习

python中pass语言学习
  • x_r_su
  • x_r_su
  • 2017-01-18 13:31:15
  • 1015

While True用法

存在即合理,这就说明他有一定的用处。例如:我以前做的一个学生信息录入系统需要循环添加每一个学生的信息进去,这时候可以用While(true){//添加信息的代码},来不停的循环添加。当不需要添加的时候...
  • MATLAB_probie
  • MATLAB_probie
  • 2016-12-13 17:19:47
  • 2386
收藏助手
不良信息举报
您举报文章:Python天坑系列(一):while 1比while True更快?
举报原因:
原因补充:

(最多只允许输入30个字)