以前、リスト スライスをできるだけ効率的に反復処理したいという質問に答えようとしていました。
for x in lst[idx1:]:
コピーを作成するため、理想的ではありません (一般に、これは ですO(n)
)。次に考えたのは、 を使用することitertools.islice
でした。しかし、ドキュメントを見ると、探しているインデックスが見つかるまでislice
呼び出さnext
れ、その時点で値が生成され始めるようです。これもO(n)
。渡されたオブジェクトislice
が alist
または aの場合、ここで利用できる最適化があるtuple
ようです。実際にコピーを作成せずに、「スライス」を (C で) 直接反復処理できるようです。この最適化がソースにあるかどうか興味がありましたが、何も見つかりませんでした。私は C と Python のソース ツリーにあまり詳しくないので、見落としている可能性は十分にあります。
私の質問はこれです:
リスト スライスのコピーを作成せずに、不要な要素の束を (最適化された C 実装で) 焼き尽くすことなく、リストの「スライス」を反復処理する方法はありますか?
私はこれのために独自のジェネレーターを書くことができることをよく知っています (非常に素朴に、引数の多くがオプションであるべきであるなどの事実を考慮していません):
def myslice(obj,start,stop,stride):
for i in xrange(start,stop,stride):
yield obj[i]
しかし、それは最適化された C 実装に勝るものではありません。
スライスを直接ループするだけでなく、なぜこれが必要なのか疑問に思っている場合は、次の違いを考慮してください。
takewhile(lambda x: x == 5, lst[idx:]) #copy's the tail of the list unnecessarily
と
takewhile(lambda x: x == 5, islice(lst,idx,None)) #inspects the head of the list unnecessarily
そして最後に:
takewhile(lambda x: x == 5, magic_slice(lst,idx,None)) #How to create magic_slice???