Python 2.x和Python 3.x专用的轻便、内存高效的range()函数

4

我知道在Python 2.x中使用range存在缺点(它会创建一个列表,对于大范围的数据不高效),而更快的迭代器xrange则成为了替代品。然而,在Python 3.x中,range已经变成了一个迭代器,而xrange则被取消了。有没有一种方法可以编写这两个循环,使得代码具有可移植性并且使用迭代器呢?

# Python 2.x
for i in xrange(a_lot):
    use_i_in_someway(i)

# Python 3.x
for i in range(a_lot):
    use_i_in_someway(i)

我知道有人可能会做类似这样的事情:

if(platform.python_version_tuple()[0] == '3'):
    xrange = range

但我在考虑一些不那么hack-ish且非定制的东西。


2个回答

2

一个选择是使用Six模块,它提供了简单的实用程序来解决Python 2和Python 3之间的差异。它旨在支持可以在Python 2和3上工作而不需要修改的代码库。


@DJV -- 是的,但我认为没有非定制的 :( - root
这仍然是最接近我想要的答案。如果没有更好的答案,我会等几天并接受它 :) - dmg

1

1
但这假设该程序将被翻译成为针对Python 3进行优化的版本,而DJV似乎旨在保持相同程序在两者下都能以最佳状态运行。 - unwind
问题要求编写代码,可以在2/3之间无需进行任何转换即可正常工作。 - MoveFast
@unwind 是一个非常好的意图,但在大型项目中效果不佳。强烈建议阅读Armin Ronacher的文章:http://lucumr.pocoo.org/2011/12/7/thoughts-on-python3/。 - Zaur Nasibov
@unwind compat.py是一个很好的方法,可以隐藏一些差异,但它与我提到的方法(如果Python 3.x,则定义xrange或定义基于版本的自定义迭代器,例如efficient_range)几乎相同。在我看来,当涉及到良好隐藏在类中的自定义构建功能时,应该使用compat.py,而不是用于这种基本功能。 - dmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接