안녕하세요 개발자 코코넛입니다. 새해가 지나고 처음으로 글을 쓰네요.

이번에는 파이썬을 쓰면서 유용하다고 생각되는 파이썬의 문법? 스킬들을

기록할 겸 정리해 보았습니다.

  • 컴프리헨션

이 기술은 알고 나서 정말 즐겨 사용하는 문법입니다.

시각적으로는 구조가 간단한 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 에 대해서 기록해 보려고 합니다.

여기까지~