파이썬 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:
|= {k: v}
... aligned
...>>> 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 문서를 참고하시면 됩니다.