【问题标题】:Is loop 'for element in list_[a:b]' using unused copy optimized by interpreters?循环'for element in list_[a:b]'是否使用解释器优化的未使用副本?
【发布时间】:2018-05-09 13:06:43
【问题描述】:

这是吗:

for element in list_[a:b]:

在解释过程中翻译(CPython)相当于:

for i in range(a, b):
    element = list_[i]

或者是副本

list_[a:b]

真的表演了吗?

【问题讨论】:

  • 编译器无法知道list_实际上是list还是自定义对象,因此它无法优化该操作。
  • list_[a:b] 被评估。所以是的,制作了一个新副本。也许你想要itertools.islice

标签: python loops copy cpython


【解决方案1】:

副本真的执行了。解释器无法知道list_ 在运行时是什么类型的对象以及您将如何处理它(也许您将开始编辑原始list_)。 如果您不想生成副本,请使用itertools.islice

import itertools

def f(list_, a, b):
    for element in itertools.islice(list_, a, b):
        element

您可以查看我为完整(python 翻译)实现链接的islice 文档,但这是一个简化版本:

def islice(itr, start, stop):
    for index, element in enumerate(itr):
         if index == stop:
              break
         if start <= index:
              yield element

【讨论】:

  • 好的,谢谢大家(回答和 cmets)... 最后澄清一下:itertools.islice 使用相当于在一个范围内循环,然后按索引访问?
  • @E.B.请参阅我编辑的答案。 islice 适用于任何可迭代对象,即使是那些没有索引访问权限的对象(如生成器)。但是,它在功能上等同于您在列表中使用时的描述。
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多