-
[Python] 리스트 slice, pop, del 성능 비교 및 사용방법언어/파이썬 & 장고 2019. 9. 21. 22:24
slice, pop, del 사용방법
remove()
remove()는 지우고자 하는 인덱스가 아닌, 값을 입력하는 방식입니다. 만약 지우고자 하는 값이 리스트 내에 2개 이상이 있다면 순서상 가장 앞에 있는 값을 지우게 됩니다. 해당 값을 삭제 후, 리스트를 재조정합니다.
a = [1,2,1,3,4,5,1] a.remove(1) print(a) print(a[0]) # [2, 1, 3, 4, 5, 1] # 2
pop() , del
pop()과 del은 지우고자 하는 리스트의 인덱스를 받아서 지우는 방식입니다. 두 개의 차이는 pop()은 지워진 인덱스의 값을 반환하지만 del은 반환하지 않습니다. 이 차이 때문에 미세하게 del이 pop()보다 수행속도가 더 빠릅니다. 또한 remove()와 동일하게 pop()과 del은 특정 인덱스를 삭제한 다음, 리스트를 재조정합니다.
a = [1,2,1,3,4,5,1] removed = a.pop(1) print(a) print(removed) print(a[0]) # [1, 1, 3, 4, 5, 1] # 2 # 1 a = [1,2,1,3,4,5,1] del a[1] print(a) print(a[0]) # [1, 1, 3, 4, 5, 1] # 1
del은 pop()과 다르게 리스트의 범위를 지정해 삭제할 수 있습니다.
a = [1,2,1,3,4,5,1] del a[:2] print(a) # [1, 3, 4, 5, 1]
slice
슬라이싱은 위와 같이 리스트의 값을 지우는 것이 아닌, 사용자가 원하고자 하는 범위를 출력합니다. 즉, 원본 리스트는 그대로 존재하며 원하고자 하는 범위만큼 출력을 하기 위해 새로운 리스트가 생성됩니다.
a = [1,2,1,3,4,5,1] b = a[1:] print(b) print(a) # [2, 1, 3, 4, 5, 1] # [1, 2, 1, 3, 4, 5, 1]
성능비교
위에서 설명한 것과 같이 리스트를 조작하는 기능은 다양하지만 성능면으로 어떤 것을 사용해야 할 지 몰라서 성능측정을 실험했습니다.
아래 예제는 리스트에 문자를 50개 입력 후, 각각 pop(), 슬라이싱, del, remove()를 한 다음 걸린 시간을 출력한 예시입니다.
import timeit t1 = timeit.Timer('a=50*[\'a\'];a.pop(0)') t2 = timeit.Timer('b=50*[\'b\'];b[1:]') t3 = timeit.Timer('c=50*[\'c\'];del c[0]') t4 = timeit.Timer('d=50*[\'d\'];d.remove(\'d\')') r1 = t1.timeit(10000)/10000 r2 = t2.timeit(10000)/10000 r3 = t3.timeit(10000)/10000 r4 = t4.timeit(10000)/10000 print(r1) print(r2) print(r3) print(r4) # 결과 # 5.434282997157424e-07 # 6.363352003972978e-07 # 3.8072100142017007e-07 # 4.4290010118857026e-07
결과로 보면 슬라이싱이 가장 느리고 del이 가장 빠른 것으로 보입니다.
다음은 50만개를 진행한 예시입니다.
import timeit t1 = timeit.Timer('a=500000*[\'a\'];a.pop(0)') t2 = timeit.Timer('b=500000*[\'b\'];b[1:]') t3 = timeit.Timer('c=500000*[\'c\'];del c[0]') t4 = timeit.Timer('d=500000*[\'d\'];d.remove(\'d\')') r1 = t1.timeit(10000)/10000 r2 = t2.timeit(10000)/10000 r3 = t3.timeit(10000)/10000 r4 = t4.timeit(10000)/10000 print(r1) print(r2) print(r3) print(r4) # 결과 # 0.0023742580446007196 # 0.004082370479300153 # 0.0022798048890021166 # 0.0023372766565007623
위 실험을 통해 봤을 때, del이 가장 빠르고 pop()과 remove()는 비슷한 수행시간을 가지며 슬라이싱이 가장 느립니다.
요약
원본 리스트가 변질이 되지 않아야 하면 슬라이싱을 사용하는 것이 좋다.
하지만 슬라이싱은 데이터를 삭제하는 del, remove(), pop()에 비해 50% 이상 느리다.