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 Nonegirdileri.
İkinci yaklaşım kez listede geçer ve sonra tekrar bir kadar her zaman Noneulaşı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 Nonegiriş 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, numpyveya cythonPython optimizasyonlarını mikromanide etmek yerine alternatifler olabilir.
filtersürümü:filter(lambda x: x is not None, L)- Sen temizleyecektirlambdakullanarakpartialveoperator.is_notsanırım, ama o kadar daha temiz muhtemelen liste-comp beri değmez.