|
| 1 | +# **Python 최신 버전 개선점** |
| 2 | + |
| 3 | +Python에서는 기존의 가장 큰 단점으로 꼽히던 속도 개선을 위한 Faster CPython 프로젝트를 진행하였다. |
| 4 | + |
| 5 | +이를 통해 Python 3.11부터 본격적으로 해당 프로젝트의 결과가 적용되었으며, Python 3.11은 Python 3.10보다 10-60% 더 빨라졌다. |
| 6 | + |
| 7 | +이후 Python 3.13까지 꾸준히 Faster CPython 프로젝트가 적용되어 다방면으로 속도 개선이 진행되고 있다. |
| 8 | + |
| 9 | +## **Python 3.11** |
| 10 | + |
| 11 | +### 새로운 표준 라이브러리 모듈 |
| 12 | + |
| 13 | +- **PEP 680**: `tomllib`을 추가하여 표준 라이브러리에서 TOML 파일을 직접 파싱할 수 있도록 지원한다. |
| 14 | + |
| 15 | +### `requirements.txt` 대신 `pyproject.toml` 사용 |
| 16 | + |
| 17 | +많은 프로젝트에서 패키지 종속성을 관리할 때 `requirements.txt`를 사용하지만, Python에서는 공식적으로 `pyproject.toml`을 사용하는 것이 권장된다. |
| 18 | + |
| 19 | +#### `requirements.txt`의 문제점 |
| 20 | +1. **공식 표준이 아님**: `requirements.txt`는 관습적으로 사용된 파일일 뿐, Python의 공식 표준이 아니다. |
| 21 | +2. **의존성 관리의 불편함**: `dev-requirements.txt`, `test-requirements.txt` 등 별도의 파일을 만들어야 하므로 관리가 번거롭다. |
| 22 | + |
| 23 | +#### `pyproject.toml`을 사용하면? |
| 24 | +1. **PEP 518 표준을 따르는 공식적인 방식**으로 관리할 수 있다. |
| 25 | +2. **환경별 의존성 관리가 가능**하여 개발 환경과 배포 환경을 쉽게 구분할 수 있다. |
| 26 | + |
| 27 | +#### 사용 예시 |
| 28 | +```toml |
| 29 | +[tool.poetry] |
| 30 | +name = "my_project" |
| 31 | +version = "0.1.0" |
| 32 | +description = "My Python Project" |
| 33 | +authors = ["Your Name <your.email@example.com>"] |
| 34 | + |
| 35 | +[tool.poetry.dependencies] |
| 36 | +python = "^3.10" |
| 37 | +requests = "^2.28.0" |
| 38 | +numpy = "^1.23.0" |
| 39 | + |
| 40 | +[tool.poetry.group.dev.dependencies] |
| 41 | +pytest = "^7.1.2" |
| 42 | +black = "^22.6.0" |
| 43 | +``` |
| 44 | + |
| 45 | +패키지를 설치할 때는 `pip install .` 또는 `poetry install`을 사용한다. |
| 46 | + |
| 47 | +## **Python 3.12** |
| 48 | + |
| 49 | +### 새로운 문법 추가 (PEP 701, f-string 개선) |
| 50 | + |
| 51 | +기존 f-string의 제한을 완화하여 더욱 강력하게 사용할 수 있도록 개선되었다. |
| 52 | + |
| 53 | +#### 개선된 사항 |
| 54 | +1. 같은 따옴표(`'` 또는 `"` )를 재사용할 수 있다. |
| 55 | +2. 여러 줄 표현과 주석을 지원한다. |
| 56 | +3. 백슬래시(\) 및 유니코드 문자를 사용할 수 있다. |
| 57 | +4. 에러 메시지가 더욱 명확하게 제공된다. |
| 58 | + |
| 59 | +#### 예제 코드 |
| 60 | +```python |
| 61 | +songs = ["Take me back to Eden", "Alkaline", "Ascensionism"] |
| 62 | +print(f"This is the playlist: {', '.join(songs)}") |
| 63 | + |
| 64 | +playlist = f""" |
| 65 | +This is the playlist: {", ".join([ |
| 66 | + "Take me back to Eden", # 첫 번째 곡 |
| 67 | + "Alkaline", # 두 번째 곡 |
| 68 | + "Ascensionism" # 세 번째 곡 |
| 69 | +])} |
| 70 | +""" |
| 71 | +print(playlist) |
| 72 | +``` |
| 73 | + |
| 74 | +### 새로운 타입 어노테이션 추가 (PEP 695) |
| 75 | + |
| 76 | +Python 3.12에서는 제네릭(Generic) 타입을 보다 간결하게 정의할 수 있도록 개선되었다. |
| 77 | + |
| 78 | +#### 개선된 사항 |
| 79 | +1. `TypeVar`을 선언할 필요 없이 `[T]`를 바로 사용할 수 있다. |
| 80 | +2. `type` 키워드를 활용하여 타입 별칭(Alias)을 선언할 수 있다. |
| 81 | +3. Bound 및 Constraints 적용이 더욱 간결해졌다. |
| 82 | + |
| 83 | +#### 예제 코드 |
| 84 | +```python |
| 85 | +def max[T](args: Iterable[T]) -> T: |
| 86 | + return max(args) |
| 87 | + |
| 88 | +class List[T]: |
| 89 | + def __getitem__(self, index: int) -> T: |
| 90 | + ... |
| 91 | + def append(self, element: T) -> None: |
| 92 | + ... |
| 93 | + |
| 94 | +type Point = tuple[float, float] |
| 95 | +type Point[T] = tuple[T, T] |
| 96 | +type HashableSequence[T: Hashable] = Sequence[T] |
| 97 | +type IntOrStrSequence[T: (int, str)] = Sequence[T] |
| 98 | +``` |
| 99 | + |
| 100 | +## **Python 3.13** |
| 101 | + |
| 102 | +### GIL 제거 지원 (Free-threaded CPython, PEP 703) |
| 103 | + |
| 104 | +기존 Python은 GIL(Global Interpreter Lock)로 인해 멀티코어를 활용하기 어려웠다. Python 3.13에서는 실험적으로 GIL을 비활성화할 수 있는 Free-threaded 모드가 추가되었다. |
| 105 | + |
| 106 | +#### 주요 특징 |
| 107 | +- 기본적으로 GIL이 활성화되어 있지만, `python3.13t` 실행 파일을 사용하면 GIL 없이 실행할 수 있다. |
| 108 | +- 실행 방법: |
| 109 | + ```bash |
| 110 | + python3.13t # GIL이 없는 실행 파일 사용 |
| 111 | + python3.13 -X gil=0 # 기존 실행 파일에서 GIL 제거 모드 실행 |
| 112 | + ``` |
| 113 | +- 현재는 실험적인 기능이며 일부 성능 저하가 있을 수 있다. |
| 114 | + |
| 115 | +#### GIL 상태 확인 방법 |
| 116 | +```python |
| 117 | +import sys |
| 118 | +print(sys._is_gil_enabled()) # False면 GIL이 비활성화된 상태 |
| 119 | +``` |
| 120 | + |
| 121 | +### JIT(Just-In-Time) 컴파일러 도입 |
| 122 | + |
| 123 | +Python 3.13에서는 JIT 컴파일러가 실험적으로 추가되어 실행 속도를 향상시킬 수 있다. |
| 124 | + |
| 125 | +#### 주요 특징 |
| 126 | +- 자주 실행되는 바이트코드를 기계어로 변환하여 실행 속도를 높인다. |
| 127 | +- 실행 방법: |
| 128 | + ```bash |
| 129 | + python3.13 --enable-experimental-jit # JIT 활성화 |
| 130 | + ``` |
| 131 | +- 설정 옵션: |
| 132 | + - `--enable-experimental-jit=yes`: JIT 활성화 |
| 133 | + - `--enable-experimental-jit=no`: JIT 비활성화 |
| 134 | + - `PYTHON_JIT=1`: 런타임에서 JIT 활성화 |
| 135 | + |
| 136 | +## 결론 |
| 137 | + |
| 138 | +Python 3.11부터 3.13까지 지속적인 성능 개선과 새로운 기능이 추가되었다. 특히, f-string 개선, 타입 어노테이션 간소화, GIL 제거 지원, JIT 컴파일러 도입 등이 주목할 만하다. 이러한 변화들을 적극 활용하면 상황에 맞게 더욱 효율적인 Python 코드를 작성할 수 있다. |
| 139 | + |
0 commit comments