最近几天改网上的代码(好吧,我只是个搬运工)。。。然后,有python2的代码xrange处在python3的地方报错,然后我改成了range不报错了,然后,实验室的妹子问起原因,然后,我。。。。。。于是,仔细查了查他们之间的区别
先看结果:
Python 2.7.12 (default, Nov 20 2017, 18:23:56)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in xrange(1,3):
... print i
...
1
2
>>> for i in range(1,3):
... print i
...
1
2
>>> exit()
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in xrange(1,3):
... print(i)
...
Traceback (most recent call last):
File "", line 1, in
NameError: name 'xrange' is not defined
>>> for i in range(1,3):
... print(i)
...
1
2
确实会报错。。。
再看看两个的数据类型
Python 2.7.12 (default, Nov 20 2017, 18:23:56)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = xrange(1,3)
>>> print type(x)
<type 'xrange'>
>>> x = range(1,3)
>>> print type(x)
<type 'list'>
哎呦。。。list数据类型是列表,那,xrange是啥咧?
上网查了下,xrange是返回一个生成器
如:
>>> x = xrange(1,3)
>>> print x
xrange(1, 3)
>>> x = range(1,3)
>>> print x
[1, 2]
那,讲道理,不用生成一个list,程序是不是会更快呢(应该是的,要不然那么多算法里面用了xrange)?
我们做如下实验(鉴于程序运行cpu的时间可能和电脑的其他程序有关,我们用一个复(luan)杂(xie)的例子进行对比。。。。
import time
sums = 0
x1 = time.clock()
for i in range(1, 100000000):
sums += 3*i
x2 = time.clock()
for i in xrange(1, 100000000):
sums += 3*i
x3 = time.clock()
print x2-x1, x3-x2
结果如下
12.074461 10.134922
速度上确实range稍逊一筹
在python3中将xrange取消了,
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = range(1,3)
>>> print(type(x))
'range'>
>>>
同样的代码,在python3中的表现如何呢?
import time
sums = 0
x1 = time.clock()
for i in range(1, 100000000):
sums += 3*i
x2 = time.clock()
print(x2-x1)
这里的结果居然是,不如前两个结果
13.788235
好吧,下次再被问起,就可以大概讲(zhuang)一下啦。。。
至于速度方面的问题,这个只是在这段程序中的表现而已,不能作为绝对的指标。。。希望有大神可以留言讨论这个问题