Python 的 range(start, stop, step) 缓存值得吗?

6
在运行一个关于 Python 的程序时,该程序使用了一个包含有限次数的循环结构(即 for 循环),例如:
while some_clause:
    for i in range(0, 1000)
        pass
    ...

range缓存,这样做有意义吗:

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

还是它不会带来太多好处?


2
如有疑问:进行基准测试。 - deceze
@deceze,我很感激你的意见,做基准测试总是一个好建议。但是如果你查看答案,就会发现range的工作原理以及在Python 2和3中的差异背后有一些故事。因此,我认为这个问题是有意义的。 - Anton Dovzhenko
等等等,你为什么要用 for i in range(100)?直接确保 $i$ 是整数并检查 0<=i<99 不就好了吗?如果这个建议很蠢的话请原谅。 - Gareth Ma
3个回答

8

不会影响性能,range 函数调用几乎不消耗什么资源。唯独迭代部分是必须的,才会产生开销。

有趣的是,缓存会让它变得更慢,如下面的例子所示。

我的基准测试结果:

>>> 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.

1
如果您使用的是Python 2.*range 将返回一个列表,您应该使用 xrangexrange (2.) 或 range (3.) 是 惰性求值,这意味着它实际上在您请求下一个项时才对其进行评估。
因此,不需要缓存。在需要时实例化范围,不需要任何技巧和魔术,它已经在Python中实现了。

0

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