Yineleyiciyi listeye dönüştürmenin en hızlı yolu


185

Bir iteratornesneye sahip olmak , yineleyici tarafından döndürülen nesnelerin bir listesini almak için bir liste kavrayışından daha hızlı, daha iyi veya daha doğru bir şey var mı?

user_list = [user for user in user_iterator]

1
Bunu optimize etmeden önce, bunun gerçekten darboğaz olduğunu kanıtlamak için bazı profiller yaptığınızdan emin olun.
S.Lott

1
S.Lott @. Normalde bu tutuma katılıyorum, ancak bu durumda, Python'da olduğu gibi, hız için de optimize edecek olan stilistik olarak çok fazla optimize edilmelidir.
aaronasterling

3
OP bir darboğazla ilgili hiçbir şey söylemedi. Basit bir cevapla mükemmel bir genel soru, bir profil oluşturucu aracılığıyla çalıştırılabilen belirli bir uygulamaya bağlı olması gerekmez.
Ken Williams

4
En kompakt yol [*iterator].
Challenger5

Yanıtlar:


336
list(your_iterator)

5
Aslında, neredeyse her zaman biraz daha hızlı. Ayrıca, çok daha açık.
Thomas Wouters

8
@systempuntoout Tamamen C olarak çalışır. Liste kavraması python'dur. Elbette daha hızlı çalışır.
aaronasterling

3
Python'da daha iyi bir yol olmadığı için hala tamamen nefret ediyorum. Bir ifadenin her iki tarafını da yalnızca dilimleyebilmek veya dizine ekleyebilmek için düzenlemek sıkıcıdır. (zip gibi saf bir ifade veya saf işlevli bir harita ise python3'te çok yaygındır)
Jo So

Hmm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `ve list(ax._get_lines.prop_cycler)sonsuz döngüye neden olur. Bunu ele almanın zarif bir yolu var mı?
Jens Munk

5
Benim hızlı test, [*your_iterator]yaklaşık iki kat daha hızlı olduğu ortaya çıktı list(your_iterator). Bu genellikle doğru mu, yoksa sadece belirli bir fırsat mıydı? ( mapYineleyici olarak kullandım .)
Neinstein

11

python* 3.5'ten beri yinelenebilir ambalajlama operatörünü kullanabilirsiniz :

user_list = [*your_iterator]

ama pitonik yol bunu :

user_list  = list(your_iterator)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.