티스토리 뷰
안녕하세요. Teus입니다.
이번 포스팅은 Python 3.13버전 릴리즈와 함께 공개된
Free-Threaded CPython을 빌드하고, 테스트 해본 내용을 담아봅니다.
0. GIL
GIL은 예전부터 제 포스팅에 자주 등장했지만
Python의 GC를 구현하기 위해서 한순간에는 하나의 Thread만 실행 가능하게 만드는 Lock의 일종 입니다.
그래서, Python을 사용할 경우 Thread를 썼지만 다수의 코어를 활용하지 못하는 속상한 상황이 벌어집니다.
(멀티코어를 동시에 사용하지 못하는 거세당한 python의 멀티Thread🥺)
하지만 python.org의 discussion을 통해서 GIL-free상태의 Python의 개발 방향에 대해서 논의된 적이 있습니다.
그리고, 로드맵에 있던 대로 기본 모드가 아니라
별도의 빌드를 통해서 no-GIL형태의 Python을 3.13부터 실험적으로 빌드할 수 있게 되었습니다!
1. no-GIL 빌드하기
아래 공식 홈페이지와 게시글을 참고 하였습니다.
https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython
https://py-free-threading.github.io/installing_cpython/#__tabbed_1_1
리눅스 기준으로 진행합니다
먼저 curl을 사용해서 python공식 홈페이지에서 3.13.0버전의 소스코드를 받아옵니다.
export PYTHON_VERSION=3.13.0
export PYTHON_MAJOR=3
curl -O https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz
그리고 받아온 소스파일을 압축 해제하고, 설치를 진행합니다.
tar -xvzf Python-${PYTHON_VERSION}.tgz
cd Python-${PYTHON_VERSION}
./configure --with-pydebug --disable-gil
sudo make
sudo make install
이러면 이제 /usr/local/bin/python3
위치에 정상적으로 python3.13.0을 확인할 수 있습니다.
실제 python을 켜봐도 experimental build임을 확인할 수 있습니다.
2. benchmark
이제 threading을 사용할 때 실제로 gil없이 빠르게 계산이 되는지를 확인해 보겠습니다.
이번에는 단순하게 ElementWise Power연산을 진행 해 보았습니다.
from multiprocessing.pool import ThreadPool
import threading
def power_foo(x):
return x*x
cnt = 10000000
import time
my_pool = ThreadPool(16)
st = time.time()
ret = my_pool.map(double_foo, [i for i in range(cnt)])
print("threading time : ", time.time() - st)
st = time.time()
ret = list(map(double_foo, [i for i in range(cnt)]))
print("normal time : ", time.time() - st)
보는것처럼 속도향상을 얻어 갈 수 있습니다.
3. 이모저모.
하지만 아직 실험 빌드인 만큼, 실행 후 pool을 닫지않는다 던가 하면 Error를 발생시킵니다.
아무래도 아직까지는 동작만 가능하고, 완벽한 동작을 보장하지는 않는것 같습니다.
하지만 이런 실험빌드를 통해서라도 GIL Free상태의 코드실행을 Python에서 볼 수 있다니 세삼눈물이 다 납니다.🥺
'Python 잡지식' 카테고리의 다른 글
[Python]CPython with JIT(3.13버전 실험기능) (1) | 2024.11.23 |
---|---|
[Python]PEP703. CPython의 GIL을 선택사항으로 관련해서 (0) | 2024.11.13 |
[Python]MultiProcessing 탐구 (0) | 2024.08.21 |
[Python]Python의 asyncio 탐구 (0) | 2024.07.10 |
[Python]비동기로 parquet 파일 읽어들이기 (0) | 2024.07.06 |
- Total
- Today
- Yesterday
- hash
- 자료구조
- 사칙연산
- 이분탐색
- Python
- 컴퓨터그래픽스
- prime number
- 동적계획법
- 코딩테스트
- stack
- Search알고리즘
- 병렬처리
- Greedy알고리즘
- SIMD
- heap
- Sort알고리즘
- 분할정복
- AVX
- 프로그래머스
- GDC
- 알고리즘
- git
- C++
- 완전탐색 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |