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 NoneEinträgen kostspielig sein kann .
Der zweite Ansatz geht die Liste einmal und dann jedes Mal erneut durch, bis a Noneerreicht 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 NoneEinträge vorne beschleunigen , aber der schlimmste Fall wäre, wenn viele NoneEinträ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 numpyoder cythonmöglicherweise lohnende Alternativen, anstatt zu versuchen, Python-Optimierungen zu verwalten.
filterVersion:filter(lambda x: x is not None, L)- Sie könnten dielambdaVerwendung loswerdenpartialundoperator.is_notich denke, aber es lohnt sich wahrscheinlich nicht, da die Listen-Komposition so viel sauberer ist.