Ітерація проти космосу , використання може бути проблемою. У різних ситуаціях профілювання може виявляти або "швидше", і / або "менше пам'яті".
# 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, ...]
Перший підхід (як і було запропоновано @jamylak , @Raymond Hettinger і @Dipto ) створює копію списку в пам'яті, що може бути дорогим для великого переліку з декількома None
записами.
Другий підхід проходить через список один раз, а потім знову кожен раз , поки НЕ None
буде досягнутий. Це може бути менш об'ємною пам'яттю, і список зменшуватиметься з часом. Зменшення розміру списку може пришвидшити кількість None
записів спереду, але найгіршим випадком було б, якби багато None
записів були ззаду.
Паралелізація та місцеві методи - це інші підходи, але кожен має свої ускладнення в Python. Знаючи дані та випадки використання часу виконання, а також добре програмування програми - це з чого почати інтенсивні операції чи великі дані.
Вибір будь-якого підходу, мабуть, не матиме значення у звичайних ситуаціях. Це стає більше перевагою позначення. Насправді, у таких нечастових обставинах numpy
чи cython
можуть бути доречні альтернативи замість того, щоб намагатися мікроконтролювати оптимізацію Python.
filter
варіант:filter(lambda x: x is not None, L)
- Ви могли б позбутися відlambda
використанняpartial
іoperator.is_not
я думаю, але це, ймовірно , не варто , так як список-Comp так багато чистіше.