【问题标题】:Does Python cache the for loop iterable?Python 是否缓存 for 循环可迭代?
【发布时间】:2021-10-28 19:16:47
【问题描述】:

我想知道 Python 中的 for 循环如何处理迭代。对于内存中存在的固定迭代,Python 只需使用循环对其进行迭代,例如:

x=[1,2,3,4,5]

for i in x:
    print(i)

但是假设我们使用函数生成可迭代对象,例如:

for i in sorted(x):
    print(i)

在这种情况下,可迭代对象是第一次计算,然后缓存以供后续迭代使用吗?还是每次迭代都重新计算?

当然,后者似乎真的非常低效,因此它可能以前一种方式实现。但是,我找不到任何文件来支持这种说法,所以如果有人能分享,那就太棒了!

【问题讨论】:

  • 既然你意识到这将是“真的非常低效”,那么运行一个实验怎么样?不会替换文档,但仍然...
  • 或者甚至在计算中加入一个副作用,比如打印一些东西。

标签: python for-loop caching


【解决方案1】:

试试下面的代码:

x = [1 for _ in range(10)]
for i in range(len(x)):
 print(x)
 x = [5]

如你所见,输出为:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5]
[5]
[5]
[5]
[5]
[5]
[5]
[5]
[5]

这意味着,range(len(x)) 只计算一次,并且它正在被缓存,而不是每次都计算。 希望对您有所帮助

【讨论】:

  • 没有缓存,但它提供了一个生成器对象,然后在上面计算
【解决方案2】:
x = [1, 2, 3, 4, 5]
for i in sorted(x):
    print(i)

等同于:

x = [1, 2, 3, 4, 5]
y = sorted(x)
for i in y:
    print(i)

sorted(x) 只计算一次,而不是 for 循环的每次迭代。该函数返回一个数组,然后由 for 循环对其进行迭代。

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2012-06-27
    • 2023-03-05
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2022-01-02
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多