Python学习笔记——python2与python3的区别
Python 学习笔记——py2与py3的区别
python2.7与python3.x的区别
自从学习python以来,一直使用的是python2.7,直到今年一直被警告,于是下定决心把2.7升级到3.6了。
由于python3与python2还是有一些区别的,因此总结了一下,同时还测试了同一台机器上py2与py3的速度区别,发现速度上区别也不可忽视,罗列如下:
以下截图都是在MacbookPro的Terminal上运行的ipython环境中截取的,分别运行python2.7和python3.6,左边是python2.7,右边是python3.6,首先比较语法上的区别,然后再测试速度区别;
python2.7与python3.x之间的语法区别:
print的区别
python3中的print是一个函数,而不再是一个语句,因此print后必须用括号括起来:
py3的print在操作上比py2更加灵活,print函数有两个参数sep = ’ '和end = '\n’是默认参数,修改这两个参数可以更容易地实现各种打印效果,如要实现打印后不换行,只需要写成下面形式即可
print('string1', 'string', '3', sep = ',', end = '\r')
整数除法的区别:
python2中,两个int型变量的四则运算结果仍然是int变量,包括除法,而在python3中,两个int型变量的除法结果会被调整为浮点型,其他运算方式不变。
逻辑判断符号的区别:
在python2中,逻辑不等于可以写成”<>“,也可以写成“!="。但是在python3中,只能写成"!=":
byte类型的支持
在python3中,增加了对byte类型的支持,在python2中,并不存在这种数据类型,只有bytearray类型
iterator对象的区别
python中的iterator对象或generator对象用来构造循环,在python3中,iterator对象已经没有.next()方法,获取下一个循环步骤需要使用next()函数实现:
对象的比较
python3里已经无法对某些对象进行直接比较:
取消raw_input()函数
python3中已经取消了raw_input()函数,而input()函数代替了原来python2中raw_input()函数的功能,py2中的input函数则不复存在
不再直接输出list的对象
python3中的range()函数不再直接输出一个list,而是输出一个iterator对象:
除此之外,zip函数和map函数的输出也不再是list,而是iterator
除此之外,dict类型的输出也不再是list:
数字圆整的区别
在python3中,小数的圆整不再是简单的四舍五入,而是采用“银行圆整法”根据整数部分的大小决定圆整的方向
py2与py3在速度上的区别
通过对比,发现py3的速度相对于py2是有提升的,这对需要考虑效率的朋友们是个好消息:
基本循环开销的区别
测试两个空循环的执行速度,用来对比循环的系统开销(overhead),测试结果py3胜
循环速度的比较
使用一个打印N以内所有素数的程序,对比py2与py3在数值计算和列表(内存)操作方面的速度区别:
上图中iter_test()
函数的定义如下:
def iter_test(N):
for i in range(2, N):
if N % i == 0:
return False
return True
对比结果,py3胜!看来python3.6在for-loop方面比python2.7还是做了不小的优化的,循环的overhead降低了不少(其实还不仅仅如此,从下文可以看到基本加法运算的速度提升更是惊人!)
简单加法计算的速度对比:
简单的加法运算,Py3胜,而且比例不小!这就解释了为什么打印素数的程序,python3里的效率能比python2里高出好几倍了:
numpy下的速度对比
对比python2和python3在使用numpy的计算速度对比,下列对比中,a和b的定义为:
import numpy as np
a = np.random.randint(1000, size = (1000, 1000))
b = np.random.random(size = (1000, 1000))
结果表明在使用numpy时两者速度差不多,有时候python2甚至还要快一些: