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 None
entri.
The kedua pendekatan melewati daftar sekali, dan sekali lagi setiap kali sampai None
tercapai. Ini bisa kurang intensif memori, dan daftar akan semakin kecil seiring berjalannya waktu. Penurunan ukuran daftar bisa mempercepat untuk banyak None
entri di depan, tetapi kasus terburuk adalah jika banyak None
entri 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, numpy
atau cython
mungkin merupakan alternatif yang bermanfaat daripada mencoba untuk mengoptimalkan mikro Python.
filter
:filter(lambda x: x is not None, L)
- Anda bisa menghilangkanlambda
penggunaanpartial
danoperator.is_not
saya pikir, tapi mungkin tidak sepadan karena list-comp jauh lebih bersih.