【问题标题】:Is it worth caching Python's range(start, stop, step)? [duplicate]是否值得缓存 Python 的范围(开始、停止、步进)? [复制]
【发布时间】:2020-04-05 06:14:54
【问题描述】:

在一个 Python 程序中,在一个固定的 range 上多次运行 for 循环,例如,

while some_clause:
    for i in range(0, 1000)
        pass
    ...

缓存range是否有意义:

r = range(0, 1000)
while some_clause:
    for i in r
        pass
    ...

还是不会增加很多好处?

【问题讨论】:

  • 如有疑问:基准测试。
  • @deceze 我很欣赏你的意见,做基准测试总是一个很好的建议。但是,如果您检查答案,range 的工作原理及其在 python 2 和 3 中的差异背后有一些故事。所以我认为这个问题是有道理的。
  • 等一下,等一下,你为什么要为范围内的 i 做 (100)?如何确保 $i$ 是一个整数并检查 0

标签: python


【解决方案1】:

不会,range 调用几乎没有任何作用。只有itering 部分不是可选的,是有代价的。

有趣的是,缓存由于某种原因使其变慢,如下例所示。

我的基准测试:

>>> timeit.timeit("""
for i in range(10000):
    pass""",number=10000)
1.7728144999991855
>>> timeit.timeit("""
for i in r:
    pass""","r=range(10000)",number=10000)
1.80037959999936

正如 Python 之禅所说,缓存它会破坏可读性:

Readability counts.

Explicit is better than implicit.
Simple is better than complex.

【讨论】:

    【解决方案2】:

    如果你使用 python 2.*range 将返回一个list,你应该使用xrangexrange (2.) 或 range (3.) 是 lazy evaluated,这意味着它实际上会在您请求时评估下一个请求的项目。

    所以,不,不需要缓存。实例化你需要的范围, 不需要任何技巧和魔法,它已经在 Python 中实现了。

    【讨论】:

      【解决方案3】:

      它不会受益。如果您想增强您的循环活动,请参考以下比较:https://dev.to/duomly/loops-in-python-comparison-and-performance-4f2m

      您可以了解如何改进。

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        相关资源
        最近更新 更多