안녕하세요 개발자 코코넛입니다. 새해가 지나고 처음으로 글을 쓰네요.
이번에는 파이썬을 쓰면서 유용하다고 생각되는 파이썬의 문법? 스킬들을
기록할 겸 정리해 보았습니다.
- 컴프리헨션
이 기술은 알고 나서 정말 즐겨 사용하는 문법입니다.
시각적으로는 구조가 간단한 for루프를 한줄로 축약하여 표현할 수 있는데요,
그리고 기본 for 루프보다 속도도 더 빠르다고 합니다.
예) 리스트 컴프리헨션
import time ex_list = 1000000 # for loop result = [] start_time = time.time() for e in range(ex_list): result.append(e) duration_time = time.time() - start_time print("for loop : " + str(duration_time)) # comprehension start_time = time.time() result = [e for e in range(ex_list)] duration_time = time.time() - start_time print("comprehension : " + str(duration_time))
# 실행한 화면
백만번 기준으로 리스트를 채울 경우 거의 2배의 속도 차이가 납니다.
예) 딕셔너리 컴프리헨션
import time ex_list = 1000000 # for loop result = {} start_time = time.time() for e in range(ex_list): result[str(e)] = e duration_time = time.time() - start_time print("for loop : " + str(duration_time)) # comprehension start_time = time.time() result = {str(e): e for e in range(ex_list)} duration_time = time.time() - start_time print("comprehension : " + str(duration_time))
# 실행한 화면
딕셔너리는 근소한 차이로 속도가 차이가 납니다.
이와 같이 컴프리헨션은 코드의 간결함과 속도를 살려줍니다.
하지만 위에 있는 1차 표현식 정도는 괜찬지만
result = [y for y in [x for x in range(ex_list)]]
이러한 2차 이상의 표현식은 코드의 가독성이 떨어지므로
2차 이상의 표현식을 컴프리헨션에 적용하는 것은 피하라고 권고합니다.
- multiprocessing 모듈
이 모듈은 파이썬의 GIL(Global Interpreter Lock)의 문제를 가진 병렬 기반 threading 모듈을
우회?해서 대용하여 사용할 수 있는 모듈입니다. 말 그대로 멀티프로세싱이기에 메모리가 공유되지는 않습니다.
저는 주로 병렬로 처리할 작업들을 한 리스트에 모아서 다수의 프로세스에 균등 분할하여 실행하는 것을 좋아합니다.
proc_list = [] workers = 8 for wk in range(workers): front = int(len(tasks) * (wk / workers)) rear = int(len(tasks) * ((wk + 1) / workers)) proc = Process(target=func_name, args=(tasks[front:rear],)) proc_list.append(proc) for proc in proc_list: proc.start() for proc in proc_list: proc.join()
이러한 식으로 코드를 생성하면 프로세스 8개에 작업을 균등하게 분할하여
병렬로 실행할 수 있는 것이죠.
참고로 proc.join()은 모든 프로세스가 종료될 때까지 기다리는 역할을 합니다.
여기까지 간단하게 2가지 제가 사용하는 유용한 스킬? 정도를 끄적여 보았습니다.
다음에는 파이썬의 비동기 실행 모듈인 asyncio 에 대해서 기록해 보려고 합니다.
여기까지~