Python 是否缓存 for 循环可迭代?
Does Python cache the for loop iterable?
我想知道 Python 中的 for
循环是如何处理可迭代对象的。对于存在于内存中的固定可迭代对象,Python 简单地用循环对其进行迭代,例如:
x=[1,2,3,4,5]
for i in x:
print(i)
但是假设我们使用函数生成可迭代对象,例如:
for i in sorted(x):
print(i)
在这种情况下,可迭代对象是否是第一次计算然后缓存以供后续迭代使用?还是每次迭代都重新计算?
当然,后者看起来确实效率很低,所以它可能是以前一种方式实现的。但是,我找不到任何文档来支持这种说法,所以如果有人可以分享它,那就太棒了!
试试下面的代码:
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))
只计算一次,而且是缓存的,不是每次都计算。
希望有所帮助
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 循环的每次迭代。函数 returns 一个数组,然后通过 for 循环对其进行迭代。
我想知道 Python 中的 for
循环是如何处理可迭代对象的。对于存在于内存中的固定可迭代对象,Python 简单地用循环对其进行迭代,例如:
x=[1,2,3,4,5]
for i in x:
print(i)
但是假设我们使用函数生成可迭代对象,例如:
for i in sorted(x):
print(i)
在这种情况下,可迭代对象是否是第一次计算然后缓存以供后续迭代使用?还是每次迭代都重新计算?
当然,后者看起来确实效率很低,所以它可能是以前一种方式实现的。但是,我找不到任何文档来支持这种说法,所以如果有人可以分享它,那就太棒了!
试试下面的代码:
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))
只计算一次,而且是缓存的,不是每次都计算。
希望有所帮助
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 循环的每次迭代。函数 returns 一个数组,然后通过 for 循环对其进行迭代。