파이썬은 아주 간단한 차이일지라도 성능에는 정말 다른 결과를 가져오는 일이 종종 있다.
개발하다가 너무 느린 함수가 있었는데 어떻게 기존 코드를 최적화해서 속도를 줄일 순 없을까 보던 중...
소 뒷걸음질 치다가 쥐잡은 것 마냥 속도 개선이 되었다.
그럼 어떻게..?
파이썬에서 리스트를 사용할 때 가급적 다음과 같이 사용을 지양해야 한다.
추가받을_리스트 = 추가받을_리스트 + [추가할 요소]
백문이 불여일견이니 코드와 결과를 한번 보자
from collections import deque
import time
import random
# 10000개짜리의 샘플 리스트를 무작위로 생성해보자
add_list = random.sample(range(100000), 100000)
# case1
sample_list = []
start = time.time()
for item in add_list:
sample_list = sample_list + [item]
print("case1의 소요 시간: ", time.time() - start)
# case2
sample_list = []
start = time.time()
for item in add_list:
sample_list += [item]
print("case2의 소요 시간: ", time.time() - start)
# case3
sample_list = []
start = time.time()
for item in add_list:
sample_list.append(item)
print("case3의 소요 시간: ", time.time() - start)
# case3-deque
sample_list = deque()
start = time.time()
for item in add_list:
sample_list.append(item)
print("deque의 소요 시간: ", time.time() - start)
속도는
case3>deque>case2>>>>>case1
순이 되시겠다. (append의 사용이 가장 빠름)
리스트 = 리스트 + [추가할 요소]
를 사용할 경우
방대한 리스트를 매번 불러오는 꼴이기 때문에 시간이 배로 걸리는 것으로 추정된다.
때문에 리스트에 요소를 추가하고 싶다면append 함수
를 사용하는 것이 더 적절하다.
추가할 요소가 얼마 되지 않는다면 큰 차이가 없겠지만
추가할 요소가 가령 10000개가 넘어가버린다면?
-> 그 값들을 담고 있는 무거운 리스트를 매번 부르기때문에 아주 아주 느려질 것이기 때문.
따라서 append를 사용하여 최적화를 시도하자.
추가
- deque 자료형을 사용하는 것도 최적화에 도움이 된다고 하는데 테스트를 해본 결과(#case3-deque) 리스트와 큰 차이가 있어보이진 않는다. 오히려 리스트보다 아주 미세하게 느리다.
- 또 for문 안에서 외부 라이브러리 클래스를 계속 불러오는 일을 지양하자. 매번 외부 클래스를 불러오다보면 (정말 놀랍도록) 성능이 저하가 된다.
여담으로..
pythonic하다는게 뭔뜻일까
Pythonic하다는 것이 뭔 뜻일까 나는 여지껏 파이써닉하게 코드를 짜왔나? (슬프게도 아닌 듯 하다..)
파이썬 개발자인듯 아닌듯... 하지만 파이썬을 많이 사용하고 있으니 파이썬스러운 것을 지향하고 싶지만... 말잇못이다.
파이썬은 프로그램이 커질수록 'type error'를 정말 많이 마주하게 된다. (지긋지긋해!!)
무지성으로 코드를 짜기엔 이거저거 고려 안해서 편하지만 프로그램이 커질수록 업보마냥 돌아오는 type error가 너무나 많다.
파이썬은 사용하면 할수록 편하지만 불편하다(?)
파라미터나 리턴값의 타입을 정할 수 있다면 참 좋겠는데 말이다. 파이썬도 타입스크립트같은 인기 언어가 나와주면 좋겠다.
이게 불편하니 docstring 을 잘 써줘야하지만... 일정에 쫓겨 급하게 만들다보면 독스트링을 매번 챙겨 쓰기가 여간 쉬운 일이 아니다.
사실 정말 잘 쓴 코드는 이것 저것 주석을 달아놓는 것이 아니라, 주석 없이도 소설처럼 잘 읽히는 코드라고 하는데..
아직 그런 경지가 못돼서 주석이라도 열심히 달아놓는 편이다.. 언젠가 아주 파이써닉한 개발자가 될 수 있을까..
아무튼 급 마무리.
'파이썬 문법' 카테고리의 다른 글
언어의 성능에 일희일비 하지 말기 (0) | 2022.07.24 |
---|---|
RuntimeError: can't allocate lock 에러 (feat.병렬처리) (0) | 2022.07.11 |
논리연산자 실행시 주의사항 (0) | 2019.10.04 |
변수(Variable) (0) | 2019.09.03 |
비트연산자와 논리연산자 (0) | 2019.08.18 |