반복 대 공간 , 사용량이 문제가 될 수 있습니다. 다른 상황에서 프로파일 링은 "빠른"및 / 또는 "메모리 부족"집중적 인 것으로 나타날 수 있습니다.
# 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
항목을.
두 번째 접근 방식은 목록을 한 번 통과 한 다음 a None
에 도달 할 때까지 다시 반복합니다 . 메모리 사용량이 적을 수 있으며 목록이 작을수록 작아집니다. 목록 크기가 줄어들 None
면 전면에있는 많은 항목 의 속도가 빨라질 수 있지만, 많은 None
항목이 후면에 있는 경우 최악의 경우입니다 .
병렬화 및 인플레 이스 기술은 다른 접근 방식이지만 각각 Python에서 자체적 인 문제가 있습니다. 데이터 및 런타임 유스 케이스를 알고 프로그램을 프로파일 링하는 작업은 집중적 인 조작 또는 대규모 데이터를 시작하는 곳입니다.
두 가지 방법 중 하나를 선택하면 일반적인 상황에서는 중요하지 않습니다. 표기법이 더 선호됩니다. 사실, 그러한 드문 상황에서, numpy
또는 cython
파이썬 최적화를 미세 관리하려고 시도하는 대신 가치있는 대안이 될 수 있습니다.
filter
버전 :filter(lambda x: x is not None, L)
- 당신은 없애 수 있습니다lambda
사용partial
하고operator.is_not
나는 생각하지만, 그것은 너무 깨끗 아마 목록 - 완부터 그럴 가치가 없어.