Python生成器索引优化

Mik*_*rds 3 python generator

假设我有一个生成器,我想从第10个元素中拉出但忽略前9个.生成器是我编写的函数,看起来像这样:

def myGenerator(arg1, arg2):
    for i in arg1:
        myState = doSomeWork(i, arg2)
        yield expensiveOperation(myState)
Run Code Online (Sandbox Code Playgroud)

现在我可以使用它并从中获取第10个索引,如下所示:

myGen = myGenerator(list1, list2)
tenthElement = next(itertools.islice(myGen,10,11))
Run Code Online (Sandbox Code Playgroud)

我想知道这是运行expensiveOperation十次,还是只运行一次?(编辑:它称之为10次,但下一部分是我感兴趣的.)有没有办法优化掉其他9个调用,expensiveOperation因为它们被丢弃了?(为清晰起见编辑)

我能想到的,不涉及使用发电机功能,并会正是我想要给其他几个解决方案,但语法是不是只是通过更换转向迭代函数为发电机作为清洁returnyield.

编辑:我不一定试图解决这个特定问题,而是寻找一种廉价"滚动"发电机的方法.在我正在使用的实际案例中,当我myGenerator第一次打电话时,我实际上并不知道我想要哪个索引.我可能会获得第15个指数,然后是第27个指数,然后是第82个指数.我可能想办法在第一次通话时切到第15位,但接下来我需要再滚动12次.

Ray*_*ger 5

发电机与消费者隔离 - 它不知道扔掉了什么.所以,是的,它在每一步都做了昂贵的操作.

我只想在发电机外移动昂贵的操作:

def myGenerator(arg1, arg2):
    for i in arg1:
        myState = doSomeWork(i, arg2)
        yield myState

myGen = myGenerator(list1, list2)
tenthElement = expensiveOperation(next(itertools.islice(myGen,10,11)))
Run Code Online (Sandbox Code Playgroud)