티스토리 뷰

 

이번 포스트는 각 Python 버전 별로 주된 변경점을 정리한다. 해당 포스트에서 모든 변경점을 나열하지 않는다.

필자의 기준에 따라 개인적으로 중요하다고 생각되는 부분, 흥미로운 부분을 넣었다. 독자분들도 흥미로운 부분이나 개인적으로 중요한 변경점이라고 파악된다면 댓글로 알려주면 좋겠다.


Python 3.9

  1. PEG 기반 파서(Parser)
  2. 딕셔너리 연산자
  3. 연간 릴리즈
  4. 컬렉션 타입 힌트
  5. 레거시 지원 끝

기존 LL(1) 기반 파서에서 PEG 기반 파서로 변경된 것은 언어의 유연성과 확장성을 크게 향상시키는 변화이다. LL(1) 파서는 좌에서 우로 입력을 읽어가며 하나의 토큰으로만 선택을 결정하는 단순하고 효율적인 방식이다. 하지만 좌측 재귀 처리와 복잡한 문법 확장에 한계가 있다. 반면, PEG 파서는 백트래킹을 허용해 모호한 문법이나 복잡한 패턴도 쉽게 처리할 수 있고, 문법 확장이 용이한 점이 강점이다. 이 덕분에 3.10 버전에서 match-case 구문 덕분에 도입될 수 있었다.

 

이외에도 딕셔너리 병합(|), 업데이트(|=) 연산자를 추가하여 기존의 dict.update와 {**d1, **d2}를 대체, list, dict와 같은 내장 컬렉션 타입을 제네릭 타입으로 사용 가능 하게 하는 등의 기능이 추가되었다.

  • 딕셔너리 병합
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

merged = dict1 | dict2
print(merged)  # 출력: {'a': 1, 'b': 3, 'c': 4}
  • 딕셔너리 업데이트
dict1 = {'a': 1, 'b': 2}
dict1 |= {'b': 3, 'c': 4}
print(dict1)  # 출력: {'a': 1, 'b': 3, 'c': 4}

 

이번 3.9 버전을 마지막으로 2.x 버전의 레거시 지원이 완전히 제거될 것을 예고했고, 1년 단위로 새로운 버전을 릴리즈 할 것이라는 PEP602를 공개했다.

Python 3.10

  1. match-case 문
  2. 에러 메시지 개선
  3. 유니언 타입

패턴 매칭을 지원하는 match-case 구문이 추가되어 데이터 구조의 복잡한 조건 분기를 더 간결하고 직관적으로 처리할 수 있게 되었다. 이는 switch-case와 유사하지만, 데이터 해체와 다양한 패턴을 지원하는 점에서 더 강력한 기능을 제공한다. 아래는 그 예시이다.

def http_status(code):
    match code:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Internal Server Error"
        case _:
            return "Unknown"

 

드디어...! 에러 메시지가 더 직관적이고 상세하게 개선되어 디버깅이 훨씬 쉬워졌다. 예를 들어, 기존에는 문법 오류(SyntaxError)가 발생하면 단순히 오류 위치를 표시했지만, 이제는 구체적으로 무엇이 잘못되었는지 알려주도록 변경되었다. 아래는 잘못된 코드를 작성한 경우에 대한 예시이다.

x = 10
if x == 10 print("Hello")
  • Python 3.9 에러 메시지:
SyntaxError: invalid syntax
  • Python 3.10 에러 메시지:
SyntaxError: expected ':' after 'if' statement on line 2

 

타입 힌트에서 Union 타입을 더 간결하게 표현할 수 있도록 개선되었다. 이전에는 Union[int, str]처럼 작성해야 했지만, 이제는 int | str처럼 간단히 파이프(|) 연산자를 사용 가능하도록 변경했다. 아래는 사용 예시이다.

def process_data(data: int | str):
    if isinstance(data, int):
        return data * 2
    return data.upper()

 

Python 3.11

  1. Faster CPython

Python 3.11 버전의 주된 변화는 더 빠른 Python을 만드는 것에 있다. Startup과 Runtime에서 빠른 Python으로 만드는 것을 목표로 릴리즈 되었고, 평균적으로 3.10 대비 1.25배 빠르다(pyperformance 기준). 워크로드에 따라 10~60% 의 성능이 향상되었다.

 

빠른 Startup은 모듈 로딩 속도를 높여서 python 프로그램이 시작될 때의 오버헤드를 줄이는 것을 목표했다. 시작 시 꼭 필요한 모듈이 있다면 이를 "얼려서(freeze)" 시켜서 인터프리터가 바로 사용할 수 있도록 변경했다. 이에 따라 10~15% 정도의 더 빠른 Startup을 구현했다. 이는 짧게 많이 동작하는 프로그램의 오버헤드를 줄일 수 있다.

 

빠른 Runtime은 실행 중에 동작하는 과정을 최적화했다. 실행 정보를 들고 있는 Python 프레임을 "게으르게(lazy)" 생성하여 불필요한 메모 시 사용과 CPU 작업을 제거했다. 자주 호출되는 함수는 인터프리터가 내부적으로 인라인 처리해서 call 하는 오버헤드를 줄였다. 예시로 math 함수 같은 것이 있을 수 있다. 흥미로운 점은 "적응형(adaptive)" 하게 자주 실행되는 코드를 동적으로 최적화한다는 것이다. 그전까지는 미리 정해진 규칙에 따라 최적화했다면 이제는 프로그램에 맞춰서 런타임 데이터에 따라 최적화한다.

Python 3.12

  1. 타입 매개변수 문법
  2. f-string 개선

발표에서는 장난스럽게 Python 3.11에서 너무 많은 힘을 써서 3.12에는 큰 변화가 없다고 말했었다...ㅎㅎ 실제로 크게 눈여겨볼 만한 내용을 없었지만, 타입 매개변수 문법과 f-string이 개선되었다. 자주 애용하고 있는 f-string 표현식에 기능이 추가가 되었는데, 주석, 동일한 인용부호("" 안에서 " 사용하기) 표현식 사용이 허용되었다.

songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
f"This is the playlist {",".join(songs)}"

Python 3.13

  1. JIT 컴파일러
  2. GIL 비활성화
  3. 오류 메시지 개선
  4. 인터랙티브 셸
  5. 레거시 모듈 제거

파이선 3.13은 큰 변화가 있었던 버전이며, 실험적인 기능이 추가된 릴리즈이다. JIT 컴파일러와 GIL 비활성화 기능을 실험적으로 허용해 주어 사용자가 제어할 수 있도록 해주었다. 그리고 컬러로 표시되는 트레이스백과 키워드 인자입력 오류시  올바른 인자를 추천해 주는 등 개선된 오류메시지를 출력하도록 변경되었다. PyPy 기반으로 인터랙티브 셸로 환경이 변경되었고, 멀티라인 편집, 히스토리 탐색 등을 지원한다.

 

그리고 3.13에서는 레거시 모듈이 제거되어 2.x Python의 지원이 완전히 종료되었다. 2to3, lib2to3를 포함해 19개의 레거시 표준 라이브러리가 모듈 제거했다. 따라서 Python 2 버전을 아직도 사용하는 프로그램이 있다면 3.13으로 마이그레이션을 위해서는 많은 변경이 필연적이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함