Iteration vs Space , Nutzung könnte ein Problem sein. In verschiedenen Situationen kann die Profilerstellung entweder "schneller" und / oder "weniger speicherintensiv" sein.
# 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, ...]
Der erste Ansatz (wie auch von @jamylak , @Raymond Hettinger und @Dipto vorgeschlagen ) erstellt eine doppelte Liste im Speicher, was für eine große Liste mit wenigen None
Einträgen kostspielig sein kann .
Der zweite Ansatz geht die Liste einmal und dann jedes Mal erneut durch, bis a None
erreicht ist. Dies könnte weniger speicherintensiv sein und die Liste wird mit der Zeit kleiner. Die Verringerung der Listengröße könnte sich für viele None
Einträge vorne beschleunigen , aber der schlimmste Fall wäre, wenn viele None
Einträge hinten wären .
Parallelisierung und In-Place-Techniken sind andere Ansätze, aber jeder hat seine eigenen Komplikationen in Python. Wenn Sie die Daten und die Anwendungsfälle zur Laufzeit kennen und das Programm profilieren, können Sie mit intensiven Vorgängen oder großen Datenmengen beginnen.
Die Wahl eines der beiden Ansätze spielt in normalen Situationen wahrscheinlich keine Rolle. Es wird eher eine Präferenz der Notation. In der Tat, unter diesen ungewöhnlichen Umständen numpy
oder cython
möglicherweise lohnende Alternativen, anstatt zu versuchen, Python-Optimierungen zu verwalten.
filter
Version:filter(lambda x: x is not None, L)
- Sie könnten dielambda
Verwendung loswerdenpartial
undoperator.is_not
ich denke, aber es lohnt sich wahrscheinlich nicht, da die Listen-Komposition so viel sauberer ist.