Yineleme ve Uzay karşılaştırması , kullanım bir sorun olabilir. Farklı durumlarda profil oluşturma "daha hızlı" ve / veya "daha az bellek" yoğun olarak gösterilebilir.
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
İlk (aynı zamanda önerdiği yaklaşım @jamylak , @Raymond Hettinger ve @Dipto ) birkaç ile büyük bir listesi için masraflı olabilir bellekte ikinci bir liste oluşturur None
girdileri.
İkinci yaklaşım kez listede geçer ve sonra tekrar bir kadar her zaman None
ulaşılır. Bu daha az bellek yoğun olabilir ve liste gittikçe küçülür. Liste boyutundaki azalma None
, öndeki çok sayıda giriş için hızlanabilir, ancak en kötü durum, çok sayıda None
giriş arkada olsaydı olurdu .
Paralelleştirme ve yerinde teknikler diğer yaklaşımlardır, ancak her birinin Python'da kendi komplikasyonları vardır. Verileri ve çalışma zamanı kullanım durumlarını bilmek, aynı zamanda programın profilini çıkarmak, yoğun işlemler veya büyük veriler için nereden başlayacağınızdır.
Her iki yaklaşımdan birini seçmek muhtemelen ortak durumlarda önemli olmayacaktır. Daha çok bir gösterim tercihi haline gelir. Aslında, bu nadir durumlarda, numpy
veya cython
Python optimizasyonlarını mikromanide etmek yerine alternatifler olabilir.
filter
sürümü:filter(lambda x: x is not None, L)
- Sen temizleyecektirlambda
kullanarakpartial
veoperator.is_not
sanırım, ama o kadar daha temiz muhtemelen liste-comp beri değmez.