[파이썬] 파이썬 2와 파이썬 3의 스레딩 및 병렬 처리 지원 성능 차이

파이썬은 간편한 문법과 다양한 라이브러리로 인해 데이터 처리 및 분석, 웹 개발 등 다양한 분야에서 널리 사용되고 있습니다. 하지만 파이썬은 기본적으로 한 번에 하나의 작업만 수행하는 GIL(Global Interpreter Lock)이라는 제약이 있기 때문에 스레딩이나 병렬 처리의 성능에 제한이 있습니다. 그러나 파이썬 2와 파이썬 3 사이에는 스레딩 및 병렬 처리 지원에 있어서 성능 차이가 있습니다.

파이썬 2의 스레딩과 병렬 처리 지원 성능

파이썬 2에서는 스레딩을 사용하여 동시에 여러 작업을 처리할 수 있지만, GIL로 인해 실제로 여러 개의 CPU 코어를 동시에 활용할 수는 없습니다. 이는 파이썬 2에서 스레딩을 사용하여 작업을 수행할 때 싱글 코어만 사용되는 점을 의미합니다. 따라서 CPU 집약적인 작업을 처리할 때는 파이썬 2에서의 성능이 떨어질 수 있습니다.

하지만 I/O 작업에서는 파이썬 2의 스레딩이 유용할 수 있습니다. I/O 작업은 CPU 대기 시간이 많으므로 GIL의 영향을 크게 받지 않고 여러 작업을 동시에 처리할 수 있습니다.

파이썬 3의 스레딩과 병렬 처리 지원 성능

파이썬 3에서는 GIL에 대한 개선이 이루어져 스레딩 및 병렬 처리의 성능이 개선되었습니다. 파이썬 3에서는 GIL이 동시에 여러 작업을 처리할 수 있게 하여 CPU를 더욱 효율적으로 활용할 수 있게 되었습니다. 그 결과, CPU 집약적인 작업에서도 파이썬 3에서의 성능이 개선되었습니다.

또한 파이썬 3에서는 concurrent.futures라는 내장 라이브러리를 통해 병렬 처리를 지원합니다. 이 라이브러리를 사용하면 멀티스레딩, 멀티프로세싱 등 다양한 방식으로 작업을 병렬화할 수 있습니다. 이를 통해 CPU 집약적인 작업을 효과적으로 처리할 수 있습니다.

성능 차이 예시

import time
import threading
from concurrent.futures import ThreadPoolExecutor

def task():
    sum = 0
    for i in range(10000000):
        sum += i
    return sum

def single_thread():
    start = time.time()
    task()
    end = time.time()
    print("Single thread time:", end - start)

def multi_thread():
    start = time.time()
    threads = []
    for i in range(10):
        t = threading.Thread(target=task)
        t.start()
        threads.append(t)
    for t in threads:
        t.join()
    end = time.time()
    print("Multi thread time:", end - start)

def thread_pool():
    start = time.time()
    with ThreadPoolExecutor() as executor:
        futures = [executor.submit(task) for _ in range(10)]
        for future in futures:
            future.result()
    end = time.time()
    print("Thread pool time:", end - start)

single_thread()
multi_thread()
thread_pool()

위 예시는 1000만 번의 루프를 돌며 계산하는 작업을 수행하는 코드입니다. 예시에서는 세 가지 방식으로 작업을 수행하며 걸리는 시간을 측정합니다. 실행 결과를 보면 파이썬 2에서의 멀티 스레딩이 싱글 스레딩보다 성능이 좋지 않지만, 파이썬 3에서의 스레딩과 스레드풀은 싱글 스레딩보다 훨씬 빠른 결과를 보입니다.

결론

파이썬 2와 파이썬 3에서의 스레딩 및 병렬 처리 지원 성능에는 차이가 있습니다. 파이썬 2에서는 GIL로 인해 싱글 코어만 사용되기 때문에 CPU 집약적인 작업의 성능이 떨어질 수 있습니다. 하지만 I/O 작업에서는 파이썬 2의 스레딩이 효과적일 수 있습니다. 반면에 파이썬 3에서는 GIL의 개선으로 스레딩 및 병렬 처리의 성능이 개선되었으며, concurrent.futures 라이브러리를 통해 더 효과적인 병렬 처리를 지원합니다. 따라서 CPU 집약적인 작업도 파이썬 3에서 더욱 효율적으로 처리할 수 있습니다.