Iterasi vs Space , penggunaan bisa menjadi masalah. Dalam situasi yang berbeda, profil mungkin menunjukkan menjadi "lebih cepat" dan / atau "kurang memori" intensif.
# 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, ...]
The pertama pendekatan (seperti yang juga disarankan oleh @jamylak , @Raymond Hettinger , dan @Dipto ) menciptakan duplikat daftar di memori, yang bisa mahal untuk daftar besar dengan beberapa Noneentri.
The kedua pendekatan melewati daftar sekali, dan sekali lagi setiap kali sampai Nonetercapai. Ini bisa kurang intensif memori, dan daftar akan semakin kecil seiring berjalannya waktu. Penurunan ukuran daftar bisa mempercepat untuk banyak Noneentri di depan, tetapi kasus terburuk adalah jika banyak Noneentri di belakang.
Paralelisasi dan teknik in-place adalah pendekatan lain, tetapi masing-masing memiliki komplikasinya sendiri dalam Python. Mengetahui data dan kasus penggunaan runtime, serta membuat profil program adalah tempat untuk memulai operasi intensif atau data besar.
Memilih pendekatan mana pun mungkin tidak masalah dalam situasi umum. Itu menjadi lebih dari preferensi notasi. Bahkan, dalam keadaan yang tidak biasa itu, numpyatau cythonmungkin merupakan alternatif yang bermanfaat daripada mencoba untuk mengoptimalkan mikro Python.
filter:filter(lambda x: x is not None, L)- Anda bisa menghilangkanlambdapenggunaanpartialdanoperator.is_notsaya pikir, tapi mungkin tidak sepadan karena list-comp jauh lebih bersih.