最近我开始使用Python3,它缺乏xrange的伤害。

简单的例子:

Python2: 从时间导入时间为t def count (): St = t() [x for x in xrange(10000000)如果x%4 == 0] Et = t() 打印et-st count () Python3: 从时间导入时间为t def xrange (x): 返回iter(范围(x)) def count (): St = t() [x for x in xrange(10000000)如果x%4 == 0] Et = t() 打印(et-st) count ()

结果分别为:

1.53888392448 3.215819835662842

为什么呢?我是说,为什么xrange被删除了?这是一个很好的学习工具。对于初学者来说,就像我一样,就像我们所有人一样。为什么要移除它?谁能告诉我正确的PEP,我找不到。


当前回答

Python 3的range类型和Python 2的xrange一样。我不知道为什么你会看到一个减速,因为你的xrange函数返回的迭代器正是你直接迭代range所得到的。

我无法在我的系统上重现减速。以下是我的测试方法:

Python 2,使用xrange:

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)
18.631936646865853

Python 3,带range的稍微快一点:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
17.31399508687869

我最近了解到Python 3的range类型还有一些其他简洁的特性,比如支持切片:range(10,100,2)[5:25:5]是range(20,60,10)!

其他回答

Python 2中的xrange是一个生成器并实现迭代器,而range只是一个函数。 在Python3中,我不知道为什么会从xrange中删除。

修复python2代码的一种方法是:

import sys

if sys.version_info >= (3, 0):
    def xrange(*args, **kwargs):
        return iter(range(*args, **kwargs))

Python3的range是Python2的xrange。没必要用iter来包裹它。要在Python3中获得一个实际的列表,需要使用list(range(…))

如果你想要在Python2和Python3中工作,试试这个

try:
    xrange
except NameError:
    xrange = range

Python 3的range类型和Python 2的xrange一样。我不知道为什么你会看到一个减速,因为你的xrange函数返回的迭代器正是你直接迭代range所得到的。

我无法在我的系统上重现减速。以下是我的测试方法:

Python 2,使用xrange:

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)
18.631936646865853

Python 3,带range的稍微快一点:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
17.31399508687869

我最近了解到Python 3的range类型还有一些其他简洁的特性,比如支持切片:range(10,100,2)[5:25:5]是range(20,60,10)!

薪酬:~ $ python Python 2.7.6(默认,2015年6月22日,17:58:13) [GCC 4.8.2

>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)

5.656799077987671

>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)

5.579368829727173

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)

21.54827117919922

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)

22.014557123184204

timeit number=1参数:

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=1)

0.2245171070098877

>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=1)

0.10750913619995117

薪酬:~ python3美元 Python 3.4.3(默认,Oct 14 2015, 20:28:29) [GCC 4.8.4

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)

9.113872020003328

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)

9.07014398300089

与timeit数字=1,2,3,4参数工作快速和线性方式:

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=1)

0.09329321900440846

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=2)

0.18501482300052885

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=3)

0.2703447980020428

>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=4)

0.36209142999723554

因此,如果我们测量1个运行的循环周期,比如timeit。Timeit ("[x for x in range(1000000) if x%4]",number=1)(正如我们在实际代码中使用的那样)python3工作得足够快,但在重复循环中,python 2 xrange()在速度上胜过python3的range()。