【问题标题】:Portable, memory efficient range() for Python 2.x and Python 3.x适用于 Python 2.x 和 Python 3.x 的可移植、高效内存 range()
【发布时间】:2013-01-30 01:42:19
【问题描述】:

我知道 Python 2.x 中 range 的缺点(它创建的列表对于大范围而言效率低下),它是更快的迭代器对应物 xrange。然而,在 Python 3.x 中,range 是一个迭代器,xrange 被删除。有没有办法用 Python 2.x 和 Python 3.x 编写这两个循环,使代码可移植并使用迭代器?

# 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 而不是定制的东西。

【问题讨论】:

标签: python iterator range xrange


【解决方案1】:

不用担心xrange(),2to3 只是将它转换为range()。但是,如果您正在编写可移植代码,那么一个好主意是创建例如compat.py 导入跨 python 功能的文件。例如。查看pymongo源码:https://github.com/mongodb/mongo-python-driver/blob/master/bson/py3compat.py

【讨论】:

  • 但这假设程序将被翻译为针对 Python 3 优化的版本,而 DJV 听起来好像目标是保持 same程序在两者下都运行得最佳。
  • 该问题要求提供的代码可以在 2/3 的情况下工作,无需任何转换
  • @unwind,确实是一个伟大的意图,但在大型项目中效果不佳。强烈推荐阅读 Armin Ronacher 的文章:lucumr.pocoo.org/2011/12/7/thoughts-on-python3
  • @unwind compat.py 是隐藏一些差异的好方法,但它与我提到的方法几乎相同(如果 Python 3.x 则定义 xrange)或定义自定义迭代器,根据版本说efficient_range。 IMO compat.py 应该用于隐藏在类中的定制功能,而不是此类基本功能。
【解决方案2】:

另一种方法是使用 Six 模块,它提供了简单的实用程序来解决 Python 2 和 Python 3 之间的差异。它旨在支持无需修改即可在 Python 2 和 3 上运行的代码库。

【讨论】:

  • @DJV -- 是的,但我不认为真的有一个非自定义的:(
  • 这仍然是最接近我想要的答案。如果没有更好的结果,我会等待几天并接受它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多