파이썬 3.9 릴리스와 주요 변경 사항

이 글에서는 파이썬 3.9에 추가된 기능과 바뀐 점을 알아보려 합니다. What’s New In Python 3.9 — Python 3.9.0 문서를 참고하였습니다.

주의! 개인적으로 판단하기에 사소한 사항들은 번역하지 않았고, 릴리스 노트만으로 이해하기가 어려운 기능엔 설명을 조금 보태었습니다.

딕셔너리 병합(merge), 갱신(update) 연산자

병합 연산자는 |, 갱신 연산자는 |=입니다. 다음 예시를 보시죠.

병합 연산자 |

파이썬 3.7부터 딕셔너리 순서가 보존된다는 점을 유의하세요.

>>> google = {'android': 11}
>>> apple = {'ios': 14}
>>> google | apple
{'android': 11, 'ios': 14}
>>> apple | google
{'ios': 14, 'android': 11}

갱신 연산자 |=

리스트를 딕셔너리로 바꿀 때, 리스트 내에 중복 데이터가 존재하는 경우에도 갱신 연산자로 손쉽게 처리할 수 있습니다.

>>> data = [('stock', 1), ('stock', 2)]
>>> aligned = {}
>>> for k, v in data:
...   aligned |= {k: v}
...
>>> aligned
{'stock': 2}

문자열의 접두사, 접미사를 삭제하는 removeprefix(), removesuffix() 메서드 추가

문자열의 접두사나 접미사를 삭제하는 메서드가 추가되었습니다.

  • 다른 문자열 조작 메서드와 마찬가지로, 문자열 자체를 수정하지 않고 변경된 값을 반환합니다.
  • 일치하는 접두사, 접미사가 없으면 원본 문자열을 리턴합니다.

접두사 삭제 removeprefix() 메서드

>>> title = 'blahsong'
>>> title.removeprefix('blah')
'song'
>>> title
'blahsong'
>>> title.removeprefix('song')
'blahsong'

접미사 삭제 removesuffix() 메서드

>>> title = 'blahsong'
>>> title.removesuffix('song')
'blah'
>>> title
'blahsong'
>>> title.removesuffix('blah')
'blahsong'

IANA 시간대를 지원하는 zoneinfo 모듈 추가

IANA는 인터넷 할당 번호 관리기관(Internet Assigned Numbers Authority)으로 IP 주소 등 인터넷 상의 공용 자원을 관리합니다. (ICANN이 생기면서 IP 관리는 이관하였습니다.) IANA에서는 타임존 등의 표준화 작업에도 관여하고 있는데요. 이 IANA 타임존을 지원하고자 zoneinfo 모듈이 표준 라이브러리에 추가되었습니다. 사용법은 다음과 같습니다.

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime
>>> dt = datetime(2020, 10, 5, 12, tzinfo=ZoneInfo("Asia/Seoul"))
>>> print(dt)
2020-10-05 12:00:00+09:00
>>> dt.tzname()
'KST'

구문 분석기가 LL 기반에서 PEG 기반으로 변경

PEP 617에 따르면 두 분석기의 성능은 비슷하지만 PEG 기반 구문 분석기가 더 유연하다고 합니다. 파이썬 3.10에서는 LL 기반 파서와 관련된 코드가 삭제될 예정이고, 이후로는 재미있고 유용한 PEG 기반 문법들이 추가될 예정입니다.

자잘한 변경 사항들

  • date/datetime의 isocalendar() 메서드가 튜플 대신 네임드 튜플을 반환합니다.
  • math의 gcd() 메서드에서 여러 인자를 처리할 수 있습니다.
  • math의 lcm() 메서드를 사용하여 최소 공배수를 구할 수 있습니다.

성능 향상

(나노초) 3.4 3.5 3.6 3.7 3.8 3.9
변수나 속성 읽기 성능
read_local 7.1 7.1 5.4 5.1 3.9 4.0
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
read_global 15.5 19.0 14.3 13.6 7.6 7.7
read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
read_classvar_from_ class 25.6 26.5 20.7 19.5 18.4 18.6
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9
변수나 속성 쓰기 성능
write_local 8.7 9.3 5.5 5.3 4.3 4.2
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
write_global 19.7 21.2 18.0 18.0 15.8 17.2
write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7
데이터 구조 읽기 성능
read_list 24.2 24.5 20.8 20.8 19.0 21.1
read_deque 24.7 25.5 20.2 20.6 19.8 21.6
read_dict 24.3 25.7 22.3 23.0 21.0 22.5
read_strdict 22.6 24.3 19.5 21.2 18.9 21.6
데이터 구조 쓰기 성능
write_list 27.1 28.5 22.5 21.6 20.0 21.6
write_deque 28.7 30.1 22.7 21.8 23.5 23.2
write_dict 31.4 33.3 29.3 29.2 24.7 27.8
write_strdict 28.4 29.9 27.5 25.2 23.1 29.8
스택, 큐 오퍼레이션
list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5
타이밍 루프
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

이 외에 다른 변경 사항은 What’s New In Python 3.9 — Python 3.9.0 문서를 참고하시면 됩니다.

다양함을 품을 수 있는 소프트웨어 개발자가 되고 싶습니다.