イテレータをリストに変換する最速の方法


185

持つiteratorオブジェクトを、より高速な何かが反復子によって返されるオブジェクトのリストを取得するには、より良いまたはより正確なリスト内包よりもあるのでしょうか?

user_list = [user for user in user_iterator]

1
これを最適化する前に、これが本当にボトルネックであることを証明するためのプロファイリングを行っていることを確認してください。
S.Lott

1
@ S.Lott。通常、私はその態度に同意しますが、この場合は、Pythonの場合と同様に、速度的にも最適化されるように、スタイルを最適化する必要があります。
aaronasterling 2010

3
OPはボトルネックがあることについては何も言いませんでした。それは単純な答えを持つ完全に素晴らしい一般的な質問であり、プロファイラーを介して実行できる特定のアプリケーションに依存する必要はありません。
ケンウィリアムズ

4
最もコンパクトな方法は[*iterator]です。
Challenger5

回答:


336
list(your_iterator)

5
実際、ほとんどの場合、かなり高速です。また、はるかに明白です。
Thomas Wouters

8
@systempuntoout完全にCで実行されます。リスト内包表記はpythonです。もちろん、より速く実行されます。
aaronasterling 2010

3
Pythonにはこれ以上の方法はないのではないかと私は完全に嫌いです。式の両側を編集して、スライスしたりインデックスを作成したりできるようにするのは面倒です。(python3では非常に一般的です。zipのような純粋な式、または純粋な関数を使用したマップの場合)
Jo So

うーん。import matplotlib.pyplot as plt' followed by ax = plt.gca() `でlist(ax._get_lines.prop_cycler)無限ループになります。これを処理するエレガントな方法はありますか?
Jens Munk

5
私の高速テストでは、の[*your_iterator]約2倍の速さlist(your_iterator)でした。これは一般的に本当ですか、それとも特定の機会でしたか?(mapイテレータとしてaを使用しました。)
Neinstein '10

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.