python harita nesnesi yöntemleri

Bir dizi nesneden geçiyorum, her birine bir yöntem çağırıyorum:

for cell in cells:
    cell.update_type(next_cells[cell.index])

Map() ile eşdeğer yapmanın bir yolu var mı?

4
Döngü olduğu gibi iyi. map() veya bir liste kavrama kullanmayın - bunlar işlev çağrılarının dönüş değerleri listesiyle ilgilendiğiniz durumlar içindir.
katma yazar Sven Marnach, kaynak
Bu da önemli bir ayrım. Diyelim ki len (hücreler) == 1000000000 . Bu döngüyü bir map() veya liste kavrama ile değiştirirseniz, milyar girişle bir listesi oluşturup yönetiyor ve ardından hemen atıyorsunuzdur.
katma yazar Kirk Strauser, kaynak

1 cevap

Görünüşe göre update_type , None döndürür.

any(cell.update_type(next_cells[cell.index]) for cell in cells)

ancak normal bir döngüde bir sorunu yoksa, buna devam edin. Bu en okunaklı olanıdır ve zamanından önce optimizasyon yapmamalısınız.

Burada kullanmamalı burada map kullanmalısınız, çünkü onu Python işlevinde/lambda ifadesinde kullanmaktan kaçınmanın bir yolu yoktur, bu nedenle normalden daha hızlı bir avantaj elde edemezsiniz döngü.

bir liste anlamayı kullanmamalısınız, çünkü onları görmezden gelseniz bile update_type 'ın dönüş değerlerinin bir listesini biriktiriyorsunuzdur - bunun yerine .

9
katma
@ agf: next_cells bir Python listesi ise, list .__ getitem__ 'a yapılan açık bir çağrı, onları hızlandırmak yerine yavaşlatacaktır. Bana inanmıyorsan zamanla kendin yap. :)
katma yazar Sven Marnach, kaynak
@Jochen: Lütfen aşağı oylamayı tekrar gözden geçirin. Bu cevap faydalıdır ve OP açıkça sorusunun tüm amacının mikro optimizasyon olduğunu belirtir (bu cevaba ilk yorumu görün).
katma yazar Sven Marnach, kaynak
-1, çünkü optimizasyon yapmak için herhangi bir neden olmadan mikro optimizasyonlar yapıyorsunuz. Sonuç, mükemmel bir ince halkanın daha az okunabilen ve daha kırılgan bir şeye dönüştüğüdür. Bu cevaptaki tek iyi tavsiye for loop'a bağlı kalmak.
katma yazar Jochen Ritzel, kaynak
@SvenMarnach İlginç. Bu optimize edilecek bir şey için mantıklı, ama daha önce hiç düşünmedim. Bu bölümün kaldırılması (yine de sonradan eklendi).
katma yazar agf, kaynak
@Ferguzz any normal döngüden daha hızlı olabilir. Ayrıca tüm değişken aramalarının yerel olduğundan emin olun.
katma yazar agf, kaynak
@JochenRitzel "ama normal bir döngü ile ilgili bir sorun olmadığı sürece, sadece buna bağlı kal. En okunaklı olanı ve vaktinden önce optimize etmemelisin." postadaki doğrudan talimattır. Alternatif bir yöntem sunarken hala daha ne kadar net olabilirim?
katma yazar agf, kaynak
Teşekkürler. Bu mantıklı. döngü bir milyon hücre gibi bir şey üzerinde çalışıyor, bu yüzden işleri biraz hızlandırmak istedi! boşver!
katma yazar Ferguzz, kaynak
any() işleri çok az hızlandırır. Bir başka ilginç not ise, i için kullanılmasının, cell.index yerine numaralandırılmış hücrenin (hücrelerde) kullanılması veya herhangi biriyle() kullanıldığında da birkaç ms sileceği, normal for döngüsü için kullanıldığında herhangi bir etkiye sahip.
katma yazar Ferguzz, kaynak