Оптимизирован ли интерпретатор цикла 'для элемента в списке list_ [a: b]' неиспользуемой копией? - PullRequest
0 голосов
/ 09 мая 2018

Это:

for element in list_[a:b]:

переведено во время устного перевода (CPython), чтобы быть эквивалентным:

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

или это копия

list_[a:b]

действительно выполнил?

1 Ответ

0 голосов
/ 09 мая 2018

Копия действительно выполнена. Интерпретатор не может знать, что это за объект list_ во время выполнения и что вы будете с ним делать (возможно, вы начнете редактировать оригинал list_). Если вы не хотите производить копию, используйте itertools.islice:

import itertools

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

Вы можете посмотреть документацию islice, которую я связал, для полной (переведенной на Python) реализации, но это упрощенная версия:

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