python 3.x“range”类的后端口
backports.range的Python项目详细描述
将Python3.7range类作为Python2.x^{tt1}的替代品进行后台移植$ 函数(以及python pre-3.7range类)。 range类类似于xrange,因为它的值是按需计算的- 但是,range类也是一个惰性序列: 它支持索引、成员资格测试和其他序列特征。
因此,它可以同时替换range和xrange。
Features
此实现提供了在 python 3.6,并实现python3.5[1]和更高版本的collections.abc.Sequence接口。 range类可用作backports.range.range- 您可以将其导入到一个单独的名称或替换内置的range和/或xrange。
# import for explicit usage from backports.range import range as range3 values = range3(499, 501) # as a lazy, reusable iterable print(', '.join(values), 'and', ', '.join(values)) # as a lazy sequence print(500 in values, 501 in values) print(values[2], len(values))
在纯python实现中,默认情况下所有对象都可用。 此外,还可以使用Cython实现一个可选的优化实现。
Performance
对于大多数应用程序来说,backports.range在性能上是足够的。 当使用PyPy或Cython时,它的迭代速度与内置代码相当。 对于小于1000个元素的小范围,有一些小开销。 除了最高性能的应用程序之外,其他所有应用程序都不应该注意到这一点。
当使用cpython(也称为普通的python)时,纯python模式比内置模式慢得多。 同样,这对大多数应用程序都不重要,但强烈建议使用Cython$。
基准[a for a in range(...)]
Interpreter | vs Builtin range | vs Builtin xrange |
---|---|---|
Py2 | 50 - 100 | 20 - 50 |
Py3 | 25 - 30 | — |
Py2 + Cython | 3 - 6 | 1.0 - 3 |
Py3 + Cython | 1.0 - 1.2 | — |
PyPy2 | 1.4 - 1.6 | 1.6 - 2.3 |
PyPy3 | 1.0 - 1.1 | — |
Cython Optimizations
后台端口具有一个Cython实现。 它在创建range类时被透明地使用。 它优化纯在clong long范围内的操作。[2]
Compatibility
- 针对python 3.6unittests对range的特性进行了测试。
- 以下python版本经过了显式测试:
- 为了兼容,还提供了一些附加功能:
- backports.range.rangecompare的实例等于等价的builtin.rangeinstances(python 3.3中的新实例)
- index方法符合python 3.5+规范collections.abc.Sequence。[1]
- 某些功能取决于语言功能或其他模块
可用或工作方式不同:
- 在python 2.x中,比较range和其他类型不会抛出TypeError。
- 当可证明遇到builtin范围时,python实现在编译时使用自定义优化。 这些不能由后台端口复制。 注意,这只在高度优化的代码中才明显,无论如何都应该手动优化。
Status and Contributing
出于所有实际目的,后端口是完整的。 range类满足python 3.7的所有unittest,以及几个兼容性测试。 它是一个功能齐全的替代品,甚至适用于最新版本的python。
性能对于任何用例都应该是足够的。 backport在性能上与内置端口相当甚至相等。
如果您遇到任何问题,请前往issue tracker。 如果您认为可以改进代码库,请随时提交请求。
Notice
This packages includes parts of the python documentation (http://www.python.org) Copyright (C) 2001-2016 Python Software Foundation. Licensed under the Python Software Foundation License.
[1] | (1, 2) As of Python 3.6, the builtin ^{tt1}$ class is not compliant with the Python 3.5 specification of ^{tt9}$. See Issue 28197 |
[2] | The ^{tt18}$ type should fill any current CPU architecture (read 64bit). Since Python cannot parallelize instructions, this should provide maximum range with optimal performance for small values. |