Cara tercepat untuk mengonversi iterator ke daftar

185

Memiliki iteratorobjek, apakah ada sesuatu yang lebih cepat, lebih baik atau lebih benar daripada pemahaman daftar untuk mendapatkan daftar objek yang dikembalikan oleh iterator?

user_list = [user for user in user_iterator]
systempuntoout
sumber
1
Sebelum mengoptimalkan ini, pastikan Anda telah melakukan beberapa profil untuk membuktikan bahwa ini benar-benar hambatan.
S.Lott
1
@ S.Lott. Saya biasanya setuju dengan sikap itu tetapi, dalam hal ini, sangat harus dioptimalkan secara gaya yang, seperti yang sering terjadi dengan Python, akan mengoptimalkannya untuk kecepatan juga.
aaronasterling
3
OP tidak mengatakan apa-apa tentang kemacetan. Ini adalah pertanyaan umum yang sangat bagus dengan jawaban sederhana, tidak perlu bergantung pada aplikasi tertentu yang dapat dijalankan melalui profiler.
Ken Williams
4
Cara paling ringkas adalah [*iterator].
Challenger5

Jawaban:

336
list(your_iterator)
mikerobi
sumber
5
Sebenarnya, hampir selalu sedikit lebih cepat. Juga, jauh lebih jelas.
Thomas Wouters
8
@systempuntoout Ini berjalan sepenuhnya dalam C. Pemahaman daftar dalam python. Tentu saja ini berjalan lebih cepat.
aaronasterling
3
Saya masih sangat benci bahwa tidak ada cara yang lebih baik dengan python. Sangat membosankan harus mengedit kedua sisi ekspresi hanya untuk dapat mengiris atau mengindeksnya. (sangat umum di python3, jika itu ekspresi murni seperti zip, atau peta dengan fungsi murni)
Jo So
Hmm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `dan list(ax._get_lines.prop_cycler)menghasilkan loop tak terbatas. Apakah ada cara yang elegan untuk menangani ini?
Jens Munk
5
Dalam pengujian cepat saya, [*your_iterator]tampaknya sekitar dua kali lebih cepat list(your_iterator). Apakah ini umumnya benar, atau itu hanya kejadian khusus? (Saya menggunakan mapiterator.)
Neinstein
11

karena python 3.5 Anda dapat menggunakan *operator pembongkaran yang dapat diubah:

user_list = [*your_iterator]

tetapi cara pythonic untuk melakukannya adalah:

user_list  = list(your_iterator)
kederrac
sumber