Допустим, у меня есть генератор, из которого я хочу извлечь 10-й элемент, но игнорировать первый 9. Генератор - это написанная мной функция, которая выглядит примерно так:
def myGenerator(arg1, arg2):
for i in arg1:
myState = doSomeWork(i, arg2)
yield expensiveOperation(myState)
Теперь яможно использовать его и извлечь из него десятый индекс, например:
myGen = myGenerator(list1, list2)
tenthElement = next(itertools.islice(myGen,10,11))
Мне интересно, работает ли он expensiveOperation
десять раз или только один раз?(РЕДАКТИРОВАТЬ: он вызывает его 10 раз, но эта следующая часть меня интересует.) Есть ли способ оптимизировать остальные 9 вызовов до expensiveOperation
, поскольку они отбрасываются?(отредактировано для ясности)
Я могу подумать о нескольких других решениях, которые не включают использование функции генератора и дали бы именно то, что я хочу, но синтаксис не так чист, как просто превращение итеративной функции вгенератор, заменив return
на yield
.
РЕДАКТИРОВАТЬ: я не обязательно пытаюсь решить эту конкретную проблему, а не искать способ недорогой "прокрутить" генератор.В реальном случае, с которым я сейчас работаю, я не знаю, какой индекс мне нужен, когда я впервые вызываю myGenerator
.Я могу взять 15-й индекс, затем 27-й, а затем 82-й.Я мог бы, вероятно, найти способ нарезать до 15-го числа при первом вызове, но затем мне нужно прокрутить еще 12 в следующий раз.