Có gì mới trong Python 3.11¶
- Biên tập viên:
Pablo Galindo Salgado
Bài viết này giải thích các tính năng mới trong Python 3.11, so với 3.10. Python 3.11 được phát hành vào ngày 24 tháng 10 năm 2022. Để biết thông tin chi tiết đầy đủ, hãy xem changelog.
Tóm tắt -- Phát hành điểm nổi bật¶
Python 3.11 nhanh hơn Python 3.10 từ 10-60%. Trung bình, chúng tôi đo được mức tăng tốc 1,25 lần trên bộ điểm chuẩn tiêu chuẩn. Xem CPython nhanh hơn để biết chi tiết.
Các tính năng cú pháp mới:
Các tính năng tích hợp mới:
Các mô-đun thư viện tiêu chuẩn mới:
Cải tiến trình thông dịch:
Tùy chọn dòng lệnh
-Pmới và biến môi trườngPYTHONSAFEPATHthành disable automatically prepending potentially unsafe paths thànhsys.path
Tính năng gõ mới:
Các trường hợp không dùng nữa, xóa và hạn chế quan trọng:
Tính năng mới¶
PEP 657: Vị trí lỗi chi tiết trong truy nguyên¶
Khi in dấu vết, trình thông dịch bây giờ sẽ trỏ đến biểu thức chính xác gây ra lỗi, thay vì chỉ dòng. Ví dụ:
Traceback (cuộc gọi gần đây nhất):
Tệp "distance.py", dòng 11, trong <module>
print(manhattan_distance(p1, p2))
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
Tệp "distance.py", dòng 6, ở manhattan_distance
trả về abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^ ^^^ ^^ ^^
AttributionError: Đối tượng 'NoneType' không có thuộc tính 'x'
Các phiên bản trước của trình thông dịch sẽ chỉ trỏ đến dòng, khiến nó không rõ ràng đối tượng nào là None. Các lỗi nâng cao này cũng có thể hữu ích khi xử lý các đối tượng dict được lồng sâu và nhiều lệnh gọi hàm:
Traceback (cuộc gọi gần đây nhất):
Tệp "query.py", dòng 37, trong <module>
magic_arithmetic('foo')
Tệp "query.py", dòng 18, trong magic_arithmetic
trả về add_counts(x)/25
^^ ^^^ ^^ ^^ ^^ ^^ ^^
Tệp "query.py", dòng 24, trong add_counts
trả về 25 + query_user(user1) + query_user(user2)
^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
Tệp "query.py", dòng 32, trong query_user
trả về 1 + query_count(db, reply['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~~~ ^^ ^^^
TypeError: Đối tượng 'NoneType' không thể đăng ký được
Cũng như các biểu thức số học phức tạp:
Traceback (cuộc gọi gần đây nhất):
Tệp "computer.py", dòng 54, trong <module>
kết quả = (x/y/z) * (a/b/c)
~~~~~~^~~
ZeroDivisionError: chia cho 0
Ngoài ra, thông tin được sử dụng bởi tính năng truy nguyên nâng cao được cung cấp thông qua API chung, thông tin này có thể được sử dụng để so sánh bytecode instructions với vị trí mã nguồn. Thông tin này có thể được lấy bằng cách sử dụng:
Phương thức
codeobject.co_positions()trong Python.Hàm
PyCode_Addr2Location()trong C API.
Xem PEP 657 để biết thêm chi tiết. (Được đóng góp bởi Pablo Galindo, Batuhan Taskaya và Ammar Askar trong bpo-43950.)
Ghi chú
Tính năng này yêu cầu lưu trữ các vị trí cột trong Đối tượng mã, điều này có thể dẫn đến mức sử dụng bộ nhớ trình thông dịch và mức sử dụng đĩa cho các tệp Python được biên dịch tăng lên một chút. Để tránh lưu trữ thông tin bổ sung và hủy kích hoạt việc in thông tin truy nguyên bổ sung, hãy sử dụng tùy chọn dòng lệnh -X no_debug_ranges hoặc biến môi trường PYTHONNODEBUGRANGES.
PEP 654: Nhóm ngoại lệ và except*¶
PEP 654 giới thiệu các tính năng ngôn ngữ cho phép chương trình đưa ra và xử lý đồng thời nhiều trường hợp ngoại lệ không liên quan. Các kiểu dựng sẵn ExceptionGroup và BaseExceptionGroup cho phép nhóm các ngoại lệ và nâng chúng lại với nhau, đồng thời cú pháp except* mới khái quát hóa except để khớp với các nhóm con của các nhóm ngoại lệ.
Xem PEP 654 để biết thêm chi tiết.
(Được đóng góp bởi Irit Katriel trong bpo-45292. PEP được viết bởi Irit Katriel, Yury Selivanov và Guido van Rossum.)
PEP 678: Các ngoại lệ có thể được bổ sung bằng ghi chú¶
Phương thức add_note() được thêm vào BaseException. Nó có thể được sử dụng để làm phong phú thêm các ngoại lệ bằng thông tin ngữ cảnh không có sẵn tại thời điểm ngoại lệ được đưa ra. Các ghi chú đã thêm sẽ xuất hiện trong truy nguyên mặc định.
Xem PEP 678 để biết thêm chi tiết.
(Được đóng góp bởi Irit Katriel trong bpo-45607. PEP do Zac Hatfield-Dodds viết.)
Cải tiến trình khởi chạy Windows py.exe¶
Bản sao của Trình quản lý cài đặt Python đi kèm với Python 3.11 đã được cập nhật đáng kể. Hiện tại, nó hỗ trợ cú pháp công ty/thẻ như được xác định trong PEP 514 bằng cách sử dụng đối số -V:<company>/<tag> thay vì -<major>.<minor> bị giới hạn. Điều này cho phép khởi chạy các bản phân phối khác ngoài PythonCore, bản phân phối được lưu trữ trên python.org.
Khi sử dụng bộ chọn -V:, công ty hoặc thẻ có thể bị bỏ qua, nhưng tất cả các lượt cài đặt sẽ được tìm kiếm. Ví dụ: -V:OtherPython/ sẽ chọn thẻ "tốt nhất" được đăng ký cho OtherPython, trong khi -V:3.11 hoặc -V:/3.11 sẽ chọn phân phối "tốt nhất" với thẻ 3.11.
Khi sử dụng các đối số -<major>, -<major>.<minor>, -<major>-<bitness> hoặc -<major>.<minor>-<bitness> cũ, tất cả hành vi hiện tại phải được giữ nguyên từ các phiên bản trước đây và chỉ các bản phát hành từ PythonCore mới được chọn. Tuy nhiên, hậu tố -64 hiện có nghĩa là "không phải 32-bit" (không nhất thiết phải là x86-64), vì có nhiều nền tảng 64-bit được hỗ trợ. Thời gian chạy 32 bit được phát hiện bằng cách kiểm tra thẻ của thời gian chạy để tìm hậu tố -32. Tất cả các bản phát hành Python kể từ phiên bản 3.5 đều đã đưa tính năng này vào bản dựng 32 bit của chúng.
Những thay đổi ngôn ngữ khác¶
Giờ đây, bạn có thể sử dụng các biểu thức giải nén được gắn dấu sao trong câu lệnh
for. (Xem bpo-46725 để biết thêm chi tiết.)comprehensions không đồng bộ hiện được phép hiểu trong asynchronous functions. Sự hiểu biết bên ngoài ngầm trở nên không đồng bộ trong trường hợp này. (Được đóng góp bởi Serhiy Storchaka trong bpo-33346.)
Một
TypeErrorhiện được nâng lên thay vìAttributeErrortrong câu lệnhwithvàcontextlib.ExitStack.enter_context()cho các đối tượng không hỗ trợ giao thức context manager và trong câu lệnhasync withvàcontextlib.AsyncExitStack.enter_async_context()cho các đối tượng không hỗ trợ giao thức asynchronous context manager. (Được đóng góp bởi Serhiy Storchaka trong bpo-12022 và bpo-44471.)Đã thêm
object.__getstate__(), cung cấp cách triển khai mặc định của phương thức__getstate__(). Các phiên bảncopying vàpickleing của các lớp con của các kiểu dựng sẵnbytearray,set,frozenset,collections.OrderedDict,collections.deque,weakref.WeakSetvàdatetime.tzinfohiện sao chép và các thuộc tính phiên bản dưa chua được triển khai dưới dạng slots. Thay đổi này có một tác dụng phụ ngoài ý muốn: Nó ảnh hưởng đến một số ít các dự án Python hiện có không mong đợiobject.__getstate__()tồn tại. Xem các nhận xét sau trên gh-70766 để biết các cuộc thảo luận về cách giải quyết mà mã đó có thể cần. (Được đóng góp bởi Serhiy Storchaka trong bpo-26579.)
Đã thêm tùy chọn dòng lệnh
-Pvà biến môi trườngPYTHONSAFEPATH, vô hiệu hóa tính năng tự động thêm vàosys.pathcủa thư mục tập lệnh khi chạy tập lệnh hoặc thư mục hiện tại khi sử dụng-cvà-m. Điều này đảm bảo chỉ stdlib và các mô-đun đã cài đặt mới đượcimportchọn và tránh các mô-đun che khuất một cách vô ý hoặc cố ý với các mô-đun trong thư mục cục bộ (và thường là người dùng có thể ghi). (Được đóng góp bởi Victor Stinner trong gh-57684.)Tùy chọn
"z"đã được thêm vào Đặc tả định dạng ngôn ngữ nhỏ để ép âm thành 0 dương sau khi làm tròn đến độ chính xác của định dạng. Xem PEP 682 để biết thêm chi tiết. (Được đóng góp bởi John Belmonte trong gh-90153.)Byte không còn được chấp nhận trên
sys.path. Hỗ trợ bị gián đoạn giữa Python 3.2 và 3.6 mà không ai nhận thấy cho đến sau khi Python 3.10.0 được phát hành. Ngoài ra, việc đưa hỗ trợ trở lại sẽ gặp vấn đề do tương tác giữa-bvàsys.path_importer_cachekhi có sự kết hợp giữa các phímstrvàbytes. (Được đóng góp bởi Thomas Grainger trong gh-91181.)
Những thay đổi triển khai CPython khác¶
Các phương thức đặc biệt
__complex__()chocomplexvà__bytes__()chobytesđược triển khai để hỗ trợ các giao thứctyping.SupportsComplexvàtyping.SupportsBytes. (Được đóng góp bởi Mark Dickinson và Donghee Na trong bpo-24234.)siphash13được thêm vào dưới dạng thuật toán băm nội bộ mới. Nó có các đặc tính bảo mật tương tự nhưsiphash24, nhưng nó nhanh hơn một chút đối với các đầu vào dài.str,bytesvà một số loại khác hiện sử dụng nó làm thuật toán mặc định chohash(). PEP 552 hash-based .pyc files bây giờ cũng sử dụngsiphash13. (Được đóng góp bởi Inada Naoki trong bpo-29410.)Khi một ngoại lệ đang hoạt động được kích hoạt lại bằng câu lệnh
raisekhông có tham số, thì dấu vết được đính kèm với ngoại lệ này giờ đây luôn làsys.exc_info()[1].__traceback__. Điều này có nghĩa là những thay đổi được thực hiện đối với truy nguyên trong mệnh đềexcepthiện tại sẽ được phản ánh trong ngoại lệ được nêu lại. (Được đóng góp bởi Irit Katriel trong bpo-45711.)Việc thể hiện các ngoại lệ được xử lý của trạng thái thông dịch viên (còn gọi là
exc_infohoặc_PyErr_StackItem) hiện chỉ có trườngexc_value;exc_typevàexc_tracebackđã bị xóa vì chúng có thể bắt nguồn từexc_value. (Được đóng góp bởi Irit Katriel trong bpo-45711.)Một command line option mới,
AppendPath, đã được thêm vào trình cài đặt Windows. Nó hoạt động tương tự nhưPrependPath, nhưng nối thêm các thư mục cài đặt và tập lệnh thay vì thêm chúng vào trước. (Được đóng góp bởi Bastian Neuburger trong bpo-44934.)Trường
PyConfig.module_search_paths_sethiện phải được đặt thành1để khởi tạo nhằm sử dụngPyConfig.module_search_pathsđể khởi tạosys.path. Nếu không, quá trình khởi tạo sẽ tính toán lại đường dẫn và thay thế mọi giá trị được thêm vàomodule_search_paths.Đầu ra của tùy chọn
--helphiện vừa với 50 dòng/80 cột. Thông tin về các tùy chọn Python environment variables và-Xhiện có sẵn bằng cách sử dụng cờ--help-envvà--help-xoptionstương ứng cũng như với--help-allmới. (Được đóng góp bởi Éric Araujo trong bpo-46142.)Chuyển đổi giữa
intvàstrở các cơ số không phải 2 (nhị phân), 4, 8 (bát phân), 16 (thập lục phân) hoặc 32, chẳng hạn như cơ sở 10 (thập phân) hiện sẽ tăngValueErrornếu số chữ số ở dạng chuỗi vượt quá giới hạn để tránh các cuộc tấn công từ chối dịch vụ tiềm ẩn do độ phức tạp của thuật toán. Đây là biện pháp giảm nhẹ cho CVE 2020-10735. Giới hạn này có thể được định cấu hình hoặc vô hiệu hóa bằng biến môi trường, cờ dòng lệnh hoặc APIsys. Xem tài liệu integer string conversion length limitation. Giới hạn mặc định là 4300 chữ số ở dạng chuỗi.
Mô-đun mới¶
Mô-đun cải tiến¶
asyncio¶
Đã thêm lớp
TaskGroup, một asynchronous context manager chứa một nhóm nhiệm vụ sẽ đợi tất cả chúng khi thoát. Đối với mã mới, bạn nên sử dụng trực tiếpcreate_task()vàgather(). (Được đóng góp bởi Yury Selivanov và những người khác trong gh-90908.)Đã thêm
timeout(), trình quản lý bối cảnh không đồng bộ để đặt thời gian chờ cho các hoạt động không đồng bộ. Đối với mã mới, bạn nên sử dụng trực tiếpwait_for(). (Được đóng góp bởi Andrew Svetlov trong gh-90927.)Đã thêm lớp
Runner, hiển thị máy móc đượcrun()sử dụng. (Được đóng góp bởi Andrew Svetlov trong gh-91218.)Đã thêm lớp
Barriervào các nguyên hàm đồng bộ hóa trong thư viện asyncio và ngoại lệBrokenBarrierErrorcó liên quan. (Được đóng góp bởi Yves Duprat và Andrew Svetlov trong gh-87518.)Đã thêm đối số từ khóa all_errors vào
asyncio.loop.create_connection()để có thể đưa ra nhiều lỗi kết nối dưới dạngExceptionGroup.Đã thêm phương thức
asyncio.StreamWriter.start_tls()để nâng cấp các kết nối dựa trên luồng hiện có lên TLS. (Được đóng góp bởi Ian Good trong bpo-34975.)Đã thêm các hàm socket datagram thô vào vòng lặp sự kiện:
sock_sendto(),sock_recvfrom()vàsock_recvfrom_into(). Chúng có triển khai trongSelectorEventLoopvàProactorEventLoop. (Được đóng góp bởi Alex Grönholm trong bpo-46805.)Đã thêm phương thức
cancelling()vàuncancel()vàoTask. Chúng chủ yếu dành cho mục đích sử dụng nội bộ, đặc biệt là bởiTaskGroup.
bối cảnh¶
các lớp dữ liệu¶
ngày giờ¶
Thêm
datetime.UTC, bí danh tiện lợi chodatetime.timezone.utc. (Được đóng góp bởi Kabir Kwatra trong gh-91973.)datetime.date.fromisoformat(),datetime.time.fromisoformat()vàdatetime.datetime.fromisoformat()hiện có thể được sử dụng để phân tích hầu hết các định dạng ISO 8601 (chỉ trừ những định dạng hỗ trợ giờ và phút phân số). (Được đóng góp bởi Paul Ganssle trong gh-80010.)
liệt kê¶
Đổi tên
EnumMetathànhEnumType(EnumMetađược giữ làm bí danh).Đã thêm
StrEnum, với các thành viên có thể được sử dụng dưới dạng (và phải là) chuỗi.Đã thêm
ReprEnum, chỉ sửa đổi__repr__()của các thành viên trong khi trả về giá trị bằng chữ của chúng (chứ không phải tên) cho__str__()và__format__()(được sử dụng bởistr(),format()và f-strings).Đã thay đổi
Enum.__format__()(mặc định choformat(),str.format()và f-strings) để luôn tạo ra kết quả tương tự nhưEnum.__str__(): đối với các enum kế thừa từReprEnum, đó sẽ là giá trị của thành viên; đối với tất cả các enum khác, nó sẽ là tên enum và tên thành viên (ví dụ:Color.RED).Đã thêm tham số lớp boundary mới vào enum
Flagvà enumFlagBoundarycùng với các tùy chọn của nó, để kiểm soát cách xử lý các giá trị cờ ngoài phạm vi.Đã thêm trình trang trí enum
verify()và enumEnumCheckcùng với các tùy chọn của nó, để kiểm tra các lớp enum theo một số ràng buộc cụ thể.Đã thêm trình trang trí
member()vànonmember()để đảm bảo đối tượng được trang trí được/không bị chuyển đổi thành thành viên enum.Đã thêm trình trang trí
property(), hoạt động giống nhưproperty()ngoại trừ enum. Sử dụng cái này thay vìtypes.DynamicClassAttribute().Đã thêm trình trang trí enum
global_enum(), điều chỉnh__repr__()và__str__()để hiển thị các giá trị với tư cách là thành viên của mô-đun thay vì lớp enum. Ví dụ:'re.ASCII'dành cho thành viênASCIIcủare.RegexFlagchứ không phải'RegexFlag.ASCII'.Flagđược cải tiến để hỗ trợlen(), iteration vàin/not intrên các thành viên của nó. Ví dụ: phần sau đây hiện hoạt động:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)Đã thay đổi
EnumvàFlagđể các thành viên hiện được xác định trước khi__init_subclass__()được gọi;dir()hiện bao gồm các phương thức, v.v., từ các kiểu dữ liệu hỗn hợp.Đã thay đổi
Flagđể chỉ xem xét các giá trị chính (lũy thừa của hai) chính tắc trong khi các giá trị tổng hợp (3,6,10, v.v.) được coi là bí danh; cờ đảo ngược bị ép buộc tương đương tích cực của họ.
fcntl¶
Trên FreeBSD, cờ
F_DUP2FDvàF_DUP2FD_CLOEXECtương ứng được hỗ trợ, cờ trước tương đương với mức sử dụngdup2trong khi cờ sau còn đặt cờFD_CLOEXEC.
phân số¶
công cụ chức năng¶
functools.singledispatch()hiện hỗ trợtypes.UnionTypevàtyping.Unionlàm chú thích cho đối số điều phối.:>>> từ functools nhập singledispatch >>> @singledispatch ... def fun(arg, tiết=False): ... nếu dài dòng: ... print("Để tôi nói,", end=" ") ... in(arg) ... >>> @fun.register ... def _(arg: int | float, chi tiết=False): ... nếu dài dòng: ... print("Sức mạnh về số lượng, hả?", end=" ") ... in(arg) ... >>> từ cách gõ import Union >>> @fun.register ... def _(arg: Union[danh sách, bộ], chi tiết=False): ... nếu dài dòng: ... print("Liệt kê cái này:") ... đối với i, elem trong enumerate(arg): ... print(i, elem) ...
(Được đóng góp bởi Yurii Karabas trong bpo-46014.)
gzip¶
Hàm
gzip.compress()hiện nhanh hơn khi được sử dụng với đối số mtime=0 vì nó ủy quyền hoàn toàn việc nén cho một thao táczlib.compress()duy nhất. Có một tác dụng phụ của sự thay đổi này: Tiêu đề tệp gzip chứa byte "OS" trong tiêu đề của nó. Theo truyền thống, giá trị đó luôn được đặt thành giá trị 255 đại diện cho "không xác định" bởi mô-đungzip. Bây giờ, khi sử dụngcompress()với mtime=0, nó có thể được đặt thành một giá trị khác bởi thư viện zlib C cơ bản mà Python được liên kết. (Xem gh-112346 để biết chi tiết về tác dụng phụ.)
hàm băm¶
hashlib.blake2b()vàhashlib.blake2s()hiện thích libb2 hơn bản sao được cung cấp của Python. (Được đóng góp bởi Christian Heimes trong bpo-47095.)Mô-đun
_sha3bên trong với thuật toán SHA3 và SHAKE hiện sử dụng tiny_sha3 thay vì Keccak Code Package để giảm mã và kích thước nhị phân. Mô-đunhashlibưu tiên triển khai SHA3 và SHAKE được tối ưu hóa từ OpenSSL. Thay đổi này chỉ ảnh hưởng đến các cài đặt không có hỗ trợ OpenSSL. (Được đóng góp bởi Christian Heimes trong bpo-47098.)Thêm
hashlib.file_digest(), một chức năng trợ giúp để băm các tệp hoặc các đối tượng giống như tệp một cách hiệu quả. (Được đóng góp bởi Christian Heimes trong gh-89313.)
IDLE và nhàn rỗi¶
kiểm tra¶
Thêm
getmembers_static()để trả về tất cả thành viên mà không kích hoạt tra cứu động thông qua giao thức mô tả. (Được đóng góp bởi Weipeng Hong trong bpo-30533.)Thêm
ismethodwrapper()để kiểm tra xem loại đối tượng có phải làMethodWrapperTypehay không. (Được đóng góp bởi Hakan Çelik trong bpo-29418.)Thay đổi các hàm liên quan đến khung trong mô-đun
inspectđể trả về các phiên bản lớpFrameInfovàTracebackmới (tương thích ngược với các giao diện giống named tuple trước đó) bao gồm thông tin vị trí PEP 657 mở rộng (số dòng cuối, cột và cột cuối). Các chức năng bị ảnh hưởng là:(Được đóng góp bởi Pablo Galindo trong gh-88116.)
ngôn ngữ¶
Thêm
locale.getencoding()để nhận mã hóa ngôn ngữ hiện tại. Nó tương tự nhưlocale.getpreferredencoding(False)nhưng bỏ qua Python UTF-8 Mode.
khai thác gỗ¶
Đã thêm
getLevelNamesMapping()để trả về ánh xạ từ tên cấp ghi nhật ký (ví dụ:'CRITICAL') sang giá trị của Cấp độ ghi nhật ký tương ứng (ví dụ:50, theo mặc định). (Được đóng góp bởi Andrei Kulakovin trong gh-88024.)Đã thêm phương thức
createSocket()vàoSysLogHandlerđể khớp vớiSocketHandler.createSocket(). Nó được gọi tự động trong quá trình khởi tạo trình xử lý và khi phát ra một sự kiện, nếu không có ổ cắm hoạt động. (Được đóng góp bởi Kirill Pinchuk trong gh-88457.)
môn toán¶
Thêm
math.exp2(): trả về 2 lũy thừa của x. (Được đóng góp bởi Gideon Mitchell trong bpo-45917.)Thêm
math.cbrt(): trả về căn bậc ba của x. (Được đóng góp bởi Ajith Ramachandran trong bpo-44357.)Hoạt động của hai vỏ góc
math.pow()đã được thay đổi để nhất quán với thông số kỹ thuật IEEE 754. Các hoạt độngmath.pow(0.0, -math.inf)vàmath.pow(-0.0, -math.inf)bây giờ trả vềinf. Trước đây họ đã huy độngValueError. (Được đóng góp bởi Mark Dickinson trong bpo-44339.)Giá trị
math.nanhiện luôn có sẵn. (Được đóng góp bởi Victor Stinner trong bpo-46917.)
toán tử¶
Một chức năng mới
operator.callđã được thêm vào, chẳng hạn nhưoperator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Được đóng góp bởi Antony Lee trong bpo-44019.)
hệ điều hành¶
Trên Windows,
os.urandom()hiện sử dụngBCryptGenRandom(), thay vìCryptGenRandom()không được dùng nữa. (Được đóng góp bởi Donghee Na trong bpo-44611.)
đường dẫn¶
lại¶
Nhóm nguyên tử (
(?>...)) và bộ định lượng sở hữu (*+,++,?+,{m,n}+) hiện được hỗ trợ trong biểu thức thông thường. (Được đóng góp bởi Jeffrey C. Jacobs và Serhiy Storchaka trong bpo-433030.)
im lặng¶
Thêm tham số tùy chọn dir_fd trong
shutil.rmtree(). (Được đóng góp bởi Serhiy Storchaka trong bpo-46245.)
ổ cắm¶
Thêm hỗ trợ Ổ cắm CAN cho NetBSD. (Được đóng góp bởi Thomas Klausner trong bpo-30512.)
create_connection()có tùy chọn nâng cao, trong trường hợp không kết nối được, mộtExceptionGroupchứa tất cả các lỗi thay vì chỉ đưa ra lỗi cuối cùng. (Được đóng góp bởi Irit Katriel trong bpo-29980.)
sqlite3¶
Bây giờ bạn có thể vô hiệu hóa trình ủy quyền bằng cách chuyển
Noneđếnset_authorizer(). (Được đóng góp bởi Erlend E. Aasland trong bpo-44491.)Tên đối chiếu
create_collation()hiện có thể chứa bất kỳ ký tự Unicode nào. Tên đối chiếu có ký tự không hợp lệ hiện tăngUnicodeEncodeErrorthay vìsqlite3.ProgrammingError. (Được đóng góp bởi Erlend E. Aasland trong bpo-44688.)Các ngoại lệ của
sqlite3hiện bao gồm mã lỗi mở rộng SQLite làsqlite_errorcodevà tên lỗi SQLite làsqlite_errorname. (Được đóng góp bởi Aviv Palivoda, Daniel Shahaf và Erlend E. Aasland trong bpo-16379 và bpo-24139.)Thêm
setlimit()vàgetlimit()vàosqlite3.Connectionđể cài đặt và nhận giới hạn SQLite theo cơ sở kết nối. (Được đóng góp bởi Erlend E. Aasland trong bpo-45243.)sqlite3hiện đặtsqlite3.threadsafetydựa trên chế độ phân luồng mặc định mà thư viện SQLite cơ bản đã được biên dịch. (Được đóng góp bởi Erlend E. Aasland trong bpo-45613.)Lệnh gọi lại
sqlite3C hiện sử dụng các ngoại lệ không thể xử lý được nếu tính năng theo dõi lệnh gọi lại được bật. Người dùng hiện có thể đăng kýunraisable hook handlerđể cải thiện trải nghiệm gỡ lỗi của mình. (Được đóng góp bởi Erlend E. Aasland trong bpo-45828.)Tìm nạp qua rollback không còn tăng
InterfaceErrornữa. Thay vào đó, chúng tôi để thư viện SQLite xử lý những trường hợp này. (Được đóng góp bởi Erlend E. Aasland trong bpo-44092.)Thêm
serialize()vàdeserialize()vàosqlite3.Connectionđể tuần tự hóa và giải tuần tự hóa cơ sở dữ liệu. (Được đóng góp bởi Erlend E. Aasland trong bpo-41930.)Thêm
create_window_function()vàosqlite3.Connectionđể tạo các hàm cửa sổ tổng hợp. (Được đóng góp bởi Erlend E. Aasland trong bpo-34916.)Thêm
blobopen()vàosqlite3.Connection.sqlite3.Blobcho phép các thao tác I/O tăng dần trên các đốm màu. (Được đóng góp bởi Aviv Palivoda và Erlend E. Aasland trong bpo-24905.)
chuỗi¶
Thêm
get_identifiers()vàis_valid()vàostring.Template, tương ứng sẽ trả về tất cả các phần giữ chỗ hợp lệ và liệu có bất kỳ phần giữ chỗ không hợp lệ nào hay không. (Được đóng góp bởi Ben Kehoe trong gh-90465.)
hệ thống¶
sys.exc_info()hiện lấy các trườngtypevàtracebacktừvalue(trường hợp ngoại lệ), do đó, khi một ngoại lệ được sửa đổi trong khi nó đang được xử lý, những thay đổi đó sẽ được phản ánh trong kết quả của các lệnh gọi tiếp theo tớiexc_info(). (Được đóng góp bởi Irit Katriel trong bpo-45711.)Thêm
sys.exception()trả về phiên bản ngoại lệ đang hoạt động (tương đương vớisys.exc_info()[1]). (Được đóng góp bởi Irit Katriel trong bpo-46328.)Thêm cờ
sys.flags.safe_path. (Được đóng góp bởi Victor Stinner trong gh-57684.)
cấu hình hệ thống¶
Ba installation schemes mới (posix_venv, nt_venv và venv) đã được thêm vào và được sử dụng khi Python tạo môi trường ảo mới hoặc khi nó chạy từ môi trường ảo. Hai lược đồ đầu tiên (posix_venv và nt_venv) dành riêng cho hệ điều hành không phải Windows và Windows, venv về cơ bản là bí danh của một trong số chúng tùy theo hệ điều hành Python chạy trên đó. Điều này hữu ích cho các nhà phân phối hạ nguồn sửa đổi
sysconfig.get_preferred_scheme(). Mã của bên thứ ba tạo môi trường ảo mới nên sử dụng sơ đồ cài đặt venv mới để xác định đường dẫn,venvcũng vậy. (Được đóng góp bởi Miro Hrončok trong bpo-45413.)
tập tin tạm thời¶
Các đối tượng
SpooledTemporaryFilehiện thực hiện đầy đủ các phương thức củaio.BufferedIOBasehoặcio.TextIOBase(tùy thuộc vào chế độ tệp). Điều này cho phép chúng hoạt động chính xác với các API yêu cầu các đối tượng giống tệp, chẳng hạn như mô-đun nén. (Được đóng góp bởi Carey Metcalfe trong gh-70363.)
luồng¶
Trên Unix, nếu chức năng
sem_clockwait()có sẵn trong thư viện C (glibc 2.30 trở lên), phương phápthreading.Lock.acquire()hiện sử dụng đồng hồ đơn điệu (time.CLOCK_MONOTONIC) cho thời gian chờ, thay vì sử dụng đồng hồ hệ thống (time.CLOCK_REALTIME), để không bị ảnh hưởng bởi những thay đổi về đồng hồ hệ thống. (Được đóng góp bởi Victor Stinner trong bpo-41710.)
thời gian¶
Trên Unix,
time.sleep()hiện sử dụng chức năngclock_nanosleep()hoặcnanosleep(), nếu có, có độ phân giải 1 nano giây (10-9 giây), thay vì sử dụngselect()có độ phân giải 1 micro giây (10-6 giây). (Được đóng góp bởi Benjamin Szőke và Victor Stinner trong bpo-21302.)Trên Windows 8.1 trở lên,
time.sleep()hiện sử dụng bộ hẹn giờ có thể chờ dựa trên high-resolution timers có độ phân giải 100 nano giây (10-7 giây). Trước đây, nó có độ phân giải 1 mili giây (10-3 giây). (Được đóng góp bởi Benjamin Szőke, Donghee Na, Eryk Sun và Victor Stinner trong bpo-21302 và bpo-45429.)
tkinter¶
Đã thêm phương thức
info_patchlevel()trả về phiên bản chính xác của thư viện Tcl dưới dạng một bộ dữ liệu có tên tương tự nhưsys.version_info. (Được đóng góp bởi Serhiy Storchaka trong gh-91827.)
truy nguyên¶
Thêm
traceback.StackSummary.format_frame_summary()để cho phép người dùng ghi đè khung nào xuất hiện trong truy nguyên và cách chúng được định dạng. (Được đóng góp bởi Ammar Askar trong bpo-44569.)Thêm
traceback.TracebackException.print(), in phiên bảnTracebackExceptionđược định dạng vào một tệp. (Được đóng góp bởi Irit Katriel trong bpo-33809.)
đánh máy¶
Để biết những thay đổi lớn, hãy xem Các tính năng mới liên quan đến gợi ý loại.
Thêm
typing.assert_never()vàtyping.Never.typing.assert_never()rất hữu ích khi yêu cầu trình kiểm tra loại xác nhận rằng không thể truy cập được một dòng mã. Khi chạy, nó tăngAssertionError. (Được đóng góp bởi Jelle Zijlstra trong gh-90633.)Thêm
typing.reveal_type(). Điều này rất hữu ích khi hỏi bộ kiểm tra kiểu xem nó đã suy ra kiểu gì cho một biểu thức đã cho. Khi chạy, nó in loại giá trị nhận được. (Được đóng góp bởi Jelle Zijlstra trong gh-90572.)Thêm
typing.assert_type(). Điều này rất hữu ích khi yêu cầu trình kiểm tra kiểu xác nhận rằng kiểu mà nó đã suy ra cho một biểu thức đã cho khớp với kiểu đã cho. Khi chạy nó chỉ trả về giá trị nhận được. (Được đóng góp bởi Jelle Zijlstra trong gh-90638.)Các loại
typing.TypedDictbây giờ có thể là chung chung. (Được đóng góp bởi Samodya Abeysiriwardane trong gh-89026.)Các loại
NamedTuplebây giờ có thể là chung chung. (Được đóng góp bởi Serhiy Storchaka trong bpo-43923.)Cho phép phân lớp
typing.Any. Điều này hữu ích để tránh các lỗi kiểm tra kiểu liên quan đến lớp có tính năng động cao, chẳng hạn như mô hình. (Được đóng góp bởi Shantanu Jain trong gh-91154.)Trình trang trí
typing.final()hiện đặt__final__được gán trên đối tượng được trang trí. (Được đóng góp bởi Jelle Zijlstra trong gh-90500.)Hàm
typing.get_overloads()có thể được sử dụng để xem xét tình trạng quá tải của một hàm.typing.clear_overloads()có thể được sử dụng để xóa tất cả các tình trạng quá tải đã đăng ký của một hàm. (Được đóng góp bởi Jelle Zijlstra trong gh-89263.)Phương thức
__init__()của các lớp conProtocolhiện được giữ nguyên. (Được đóng góp bởi Adrian Garcia Badarasco trong gh-88970.)Việc biểu diễn các loại bộ dữ liệu trống (
Tuple[()]) được đơn giản hóa. Điều này ảnh hưởng đến sự xem xét nội tâm, ví dụ.get_args(Tuple[()])hiện đánh giá thành()thay vì((),). (Được đóng góp bởi Serhiy Storchaka trong gh-91137.)Nới lỏng các yêu cầu về thời gian chạy đối với chú thích loại bằng cách xóa kiểm tra có thể gọi được trong hàm
typing._type_checkriêng tư. (Được đóng góp bởi Gregory Beauregard trong gh-90802.)typing.get_type_hints()hiện hỗ trợ đánh giá các chuỗi dưới dạng tham chiếu chuyển tiếp trong PEP 585 generic aliases. (Được đóng góp bởi Niklas Rosenstein trong gh-85542.)typing.get_type_hints()không còn thêmOptionalvào các tham số cóNonelàm mặc định. (Được đóng góp bởi Nikita Sobolev trong gh-90353.)typing.get_type_hints()hiện hỗ trợ đánh giá các chú thíchClassVarđược xâu chuỗi đơn giản. (Được đóng góp bởi Gregory Beauregard trong gh-90711.)typing.no_type_check()không còn sửa đổi các lớp và hàm bên ngoài nữa. Bây giờ nó cũng đánh dấu chính xác các phương thức lớp là không được kiểm tra kiểu. (Được đóng góp bởi Nikita Sobolev trong gh-90729.)
dữ liệu unicode¶
Cơ sở dữ liệu Unicode đã được cập nhật lên phiên bản 14.0.0. (Được đóng góp bởi Benjamin Peterson trong bpo-45190).
nhỏ nhất¶
Đã thêm các phương thức
enterContext()vàenterClassContext()của lớpTestCase, phương thứcenterAsyncContext()của lớpIsolatedAsyncioTestCasevà hàmunittest.enterModuleContext(). (Được đóng góp bởi Serhiy Storchaka trong bpo-45046.)
venv¶
Khi môi trường ảo Python mới được tạo, venv sysconfig installation scheme được sử dụng để xác định đường dẫn bên trong môi trường. Khi Python chạy trong môi trường ảo, sơ đồ cài đặt tương tự là mặc định. Điều đó có nghĩa là các nhà phân phối hạ nguồn có thể thay đổi sơ đồ cài đặt sysconfig mặc định mà không thay đổi hành vi của môi trường ảo. Mã của bên thứ ba cũng tạo môi trường ảo mới cũng nên thực hiện tương tự. (Được đóng góp bởi Miro Hrončok trong bpo-45413.)
cảnh báo¶
warnings.catch_warnings()hiện chấp nhận các đối số chowarnings.simplefilter(), cung cấp một cách ngắn gọn hơn để bỏ qua các cảnh báo cục bộ hoặc chuyển chúng thành lỗi. (Được đóng góp bởi Zac Hatfield-Dodds trong bpo-47074.)
tập tin zip¶
Đã thêm hỗ trợ chỉ định mã hóa tên thành viên để đọc siêu dữ liệu trong thư mục và tiêu đề tệp của
ZipFile. (Được đóng góp bởi Stephen J. Turnbull và Serhiy Storchaka trong bpo-28080.)Đã thêm
ZipFile.mkdir()để tạo thư mục mới bên trong kho lưu trữ ZIP. (Được đóng góp bởi Sam Ezeh trong gh-49083.)Đã thêm
stem,suffixvàsuffixesvàozipfile.Path. (Được đóng góp bởi Miguel Brito trong gh-88261.)
Tối ưu hóa¶
Phần này bao gồm các tối ưu hóa cụ thể độc lập với dự án CPython nhanh hơn, được đề cập trong phần riêng.
Trình biên dịch hiện tối ưu hóa printf-style % formatting đơn giản trên các chuỗi ký tự chỉ chứa các mã định dạng
%s,%rvà%avà làm cho nó nhanh như biểu thức f-string tương ứng. (Được đóng góp bởi Serhiy Storchaka trong bpo-28307.)Phép chia số nguyên (
//) được điều chỉnh tốt hơn để tối ưu hóa bởi trình biên dịch. Hiện tại, nó nhanh hơn khoảng 20% trên x86-64 khi chiaintcho giá trị nhỏ hơn2**30. (Được đóng góp bởi Gregory P. Smith và Tim Peters trong gh-90564.)sum()hiện nhanh hơn gần 30% đối với các số nguyên nhỏ hơn2**30. (Được đóng góp bởi Stefan Behnel trong gh-68264.)Việc thay đổi kích thước danh sách được sắp xếp hợp lý cho trường hợp thông thường, tăng tốc
list.append()lên ≈15% và list comprehensions đơn giản lên tới 20-30% (Được đóng góp bởi Dennis Sweeney trong gh-91165.)Từ điển không lưu trữ giá trị băm khi tất cả các khóa đều là đối tượng Unicode, làm giảm kích thước
dict. Ví dụ:sys.getsizeof(dict.fromkeys("abcdefg"))giảm từ 352 byte xuống 272 byte (nhỏ hơn 23%) trên nền tảng 64 bit. (Được đóng góp bởi Inada Naoki trong bpo-46845.)Việc sử dụng
asyncio.DatagramProtocolhiện nhanh hơn rất nhiều khi truyền các tệp lớn qua UDP, với tốc độ cao hơn 100 lần đối với tệp ≈60 MiB. (Được đóng góp bởi msoxzw trong gh-91487.)Các hàm
mathcomb()vàperm()hiện nhanh hơn ≈10 lần đối với các đối số lớn (với mức tăng tốc lớn hơn cho k lớn hơn). (Được đóng góp bởi Serhiy Storchaka trong bpo-37295.)Các hàm
statisticsmean(),variance()vàstdev()hiện sử dụng các trình vòng lặp trong một lần thay vì chuyển đổi chúng thànhlisttrước tiên. Tốc độ này nhanh gấp đôi và có thể tiết kiệm bộ nhớ đáng kể. (Được đóng góp bởi Raymond Hettinger trong gh-90415.)unicodedata.normalize()hiện bình thường hóa các chuỗi thuần-ASCII trong thời gian không đổi. (Được đóng góp bởi Donghee Na trong bpo-44987.)
CPython nhanh hơn¶
CPython 3.11 là mức trung bình của 25% faster so với CPython 3.10 được đo bằng bộ điểm chuẩn pyperformance, khi được biên dịch bằng GCC trên Ubuntu Linux. Tùy thuộc vào khối lượng công việc của bạn, tốc độ tăng tốc tổng thể có thể là 10-60%.
Dự án này tập trung vào hai lĩnh vực chính trong Python: Khởi động nhanh hơn và Thời gian chạy nhanh hơn. Những tối ưu hóa không nằm trong dự án này được liệt kê riêng trong Tối ưu hóa.
Khởi động nhanh hơn¶
Nhập khẩu đông lạnh/Đối tượng mã tĩnh¶
Python lưu trữ bytecode trong thư mục __pycache__ để tăng tốc độ tải mô-đun.
Trước đây trong phiên bản 3.10, việc thực thi mô-đun Python trông như thế này:
Đọc __pycache__ -> Unmarshal -> Đối tượng mã được phân bổ heap -> Đánh giá
Trong Python 3.11, các mô-đun cốt lõi cần thiết cho việc khởi động Python đã bị "đóng băng". Điều này có nghĩa là Đối tượng mã (và mã byte) của chúng được trình thông dịch phân bổ tĩnh. Điều này làm giảm các bước trong quy trình thực hiện mô-đun thành:
Đối tượng mã được phân bổ tĩnh -> Đánh giá
Khởi động trình thông dịch hiện nhanh hơn 10-15% trong Python 3.11. Điều này có tác động lớn đối với các chương trình chạy ngắn sử dụng Python.
(Được đóng góp bởi Eric Snow, Guido van Rossum và Kumar Aditya trong nhiều số.)
Thời gian chạy nhanh hơn¶
Khung Python rẻ hơn, lười biếng hơn¶
Các khung Python, chứa thông tin thực thi, được tạo bất cứ khi nào Python gọi hàm Python. Sau đây là những tối ưu hóa khung hình mới:
Hợp lý hóa quá trình tạo khung.
Tránh phân bổ bộ nhớ bằng cách sử dụng lại nhiều không gian khung trên ngăn xếp C.
Sắp xếp hợp lý cấu trúc khung bên trong để chỉ chứa thông tin cần thiết. Các khung trước đây chứa thêm thông tin gỡ lỗi và quản lý bộ nhớ.
Zz000zz kiểu cũ hiện chỉ được tạo khi được yêu cầu bởi trình gỡ lỗi hoặc bởi các hàm xem xét nội bộ của Python như sys._getframe() và inspect.currentframe(). Đối với hầu hết mã người dùng, không có đối tượng khung nào được tạo cả. Kết quả là gần như tất cả lệnh gọi hàm Python đều tăng tốc đáng kể. Chúng tôi đã đo được mức tăng tốc 3-7% trong hiệu suất hoạt động.
(Được đóng góp bởi Mark Shannon trong bpo-44590.)
Lệnh gọi hàm Python nội tuyến¶
Trong lệnh gọi hàm Python, Python sẽ gọi hàm C đánh giá để diễn giải mã của hàm đó. Điều này hạn chế một cách hiệu quả đệ quy Python thuần túy ở mức an toàn cho ngăn xếp C.
Trong 3.11, khi CPython phát hiện mã Python gọi một hàm Python khác, nó sẽ thiết lập một khung mới và "nhảy" tới mã mới bên trong khung mới. Điều này tránh gọi hoàn toàn chức năng phiên dịch C.
Hầu hết các lệnh gọi hàm Python hiện không tiêu tốn dung lượng ngăn xếp C, giúp tăng tốc chúng. Trong các hàm đệ quy đơn giản như fibonacci hoặc giai thừa, chúng tôi đã quan sát thấy tốc độ tăng lên 1,7 lần. Điều này cũng có nghĩa là các hàm đệ quy có thể lặp lại sâu hơn đáng kể (nếu người dùng tăng giới hạn đệ quy với sys.setrecursionlimit()). Chúng tôi đo được mức cải thiện hiệu suất hoạt động là 1-3%.
(Được đóng góp bởi Pablo Galindo và Mark Shannon trong bpo-45256.)
PEP 659: Phiên dịch thích ứng chuyên dụng¶
PEP 659 là một trong những phần quan trọng của dự án Faster CPython. Ý tưởng chung là mặc dù Python là ngôn ngữ động nhưng hầu hết mã đều có các vùng mà đối tượng và kiểu hiếm khi thay đổi. Khái niệm này được gọi là type stability.
Khi chạy, Python sẽ cố gắng tìm kiếm các mẫu phổ biến và độ ổn định của kiểu trong mã thực thi. Python sau đó sẽ thay thế hoạt động hiện tại bằng một hoạt động chuyên biệt hơn. Hoạt động chuyên biệt này sử dụng các đường dẫn nhanh chỉ dành cho những trường hợp/loại sử dụng đó, thường hoạt động tốt hơn so với các đường dẫn chung của chúng. Điều này cũng mang đến một khái niệm khác gọi là inline caching, trong đó Python lưu trữ kết quả của các hoạt động tốn kém trực tiếp trong bytecode.
Chuyên gia cũng sẽ kết hợp một số cặp lệnh chung nhất định thành một siêu lệnh, giảm chi phí trong quá trình thực hiện.
Python sẽ chỉ chuyên biệt khi thấy code "nóng" (được thực thi nhiều lần). Điều này ngăn Python lãng phí thời gian vào mã chạy một lần. Python cũng có thể loại bỏ tính chuyên môn hóa khi mã quá linh hoạt hoặc khi việc sử dụng thay đổi. Chuyên môn hóa được cố gắng định kỳ và nỗ lực chuyên môn hóa không quá tốn kém, cho phép chuyên môn hóa thích ứng với hoàn cảnh mới.
(PEP do Mark Shannon viết, với ý tưởng lấy cảm hứng từ Stefan Brunthaler. Xem PEP 659 để biết thêm thông tin. Mark Shannon và Brandt Bucher thực hiện, với sự trợ giúp thêm từ Irit Katriel và Dennis Sweeney.)
hoạt động |
biểu mẫu |
Chuyên môn |
Tăng tốc hoạt động (lên tới) |
(Những) người đóng góp |
|---|---|---|---|---|
Hoạt động nhị phân |
|
Cộng, nhân và trừ nhị phân cho các loại phổ biến như |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
Chỉ số dưới |
|
Đăng ký các loại vùng chứa như Việc đăng ký |
10-25% |
Irit Katriel, Mark Shannon |
Lưu trữ đăng ký |
|
Tương tự như đăng ký chuyên môn ở trên. |
10-25% |
Dennis Sweeney |
Cuộc gọi |
|
Các lệnh gọi đến các hàm và kiểu dựng sẵn (C) phổ biến như |
20% |
Mark Shannon, Ken Jin |
Tải biến toàn cục |
|
Chỉ mục của đối tượng trong không gian tên toàn cầu/nội trang được lưu trữ. Tải toàn cầu và nội dung yêu cầu tra cứu không gian tên bằng không. |
Mark Shannon |
|
Tải thuộc tính |
|
Tương tự như tải các biến toàn cục. Chỉ mục của thuộc tính bên trong không gian tên của lớp/đối tượng được lưu trữ. Trong hầu hết các trường hợp, việc tải thuộc tính sẽ không yêu cầu tra cứu không gian tên. |
Mark Shannon |
|
Tải phương thức cho cuộc gọi |
|
Địa chỉ thực tế của phương thức được lưu trữ. Việc tải phương thức hiện không có tra cứu không gian tên -- ngay cả đối với các lớp có chuỗi kế thừa dài. |
10-20% |
Ken Jin, Mark Shannon |
Thuộc tính cửa hàng |
|
Tương tự như tối ưu hóa thuộc tính tải. |
2% trong hiệu suất hoạt động |
Mark Shannon |
Trình tự giải nén |
|
Chuyên dùng cho các loại container thông dụng như |
8% |
Brandt Bucher |
linh tinh¶
Các đối tượng bây giờ yêu cầu ít bộ nhớ hơn do các không gian tên đối tượng được tạo một cách lười biếng. Từ điển không gian tên của họ giờ đây cũng chia sẻ khóa một cách tự do hơn. (Đã đóng góp Mark Shannon trong bpo-45340 và bpo-40116.)
Các ngoại lệ "không tốn phí" được triển khai, loại bỏ chi phí của câu lệnh
trykhi không có ngoại lệ nào được đưa ra. (Được đóng góp bởi Mark Shannon trong bpo-40222.)Việc trình bày ngắn gọn hơn về các ngoại lệ trong trình thông dịch đã giảm khoảng 10% thời gian cần thiết để bắt ngoại lệ. (Được đóng góp bởi Irit Katriel trong bpo-45711.)
Công cụ khớp biểu thức chính quy của
ređã được tái cấu trúc một phần và hiện sử dụng gotos được tính toán (hoặc "mã luồng") trên các nền tảng được hỗ trợ. Kết quả là Python 3.11 thực thi pyperformance regular expression benchmarks nhanh hơn tới 10% so với Python 3.10. (Được đóng góp bởi Brandt Bucher trong gh-91404.)
FAQ¶
Tôi nên viết mã như thế nào để tận dụng những tính năng tăng tốc này?¶
Viết mã Pythonic tuân theo các phương pháp hay nhất phổ biến; bạn không phải thay đổi mã của mình. Dự án Faster CPython tối ưu hóa các mẫu mã phổ biến mà chúng tôi quan sát được.
CPython 3.11 có sử dụng nhiều bộ nhớ hơn không?¶
Có lẽ không; chúng tôi không mong đợi mức sử dụng bộ nhớ sẽ cao hơn 20% so với 3.10. Điều này được bù đắp bằng cách tối ưu hóa bộ nhớ cho các đối tượng khung và từ điển đối tượng như đã đề cập ở trên.
Tôi không thấy bất kỳ sự tăng tốc nào trong khối lượng công việc của mình. Tại sao?¶
Một số mã nhất định sẽ không có lợi ích đáng chú ý. Nếu mã của bạn dành phần lớn thời gian cho các hoạt động I/O hoặc đã thực hiện phần lớn tính toán trong thư viện tiện ích mở rộng C như NumPy thì tốc độ sẽ không tăng đáng kể. Dự án này hiện mang lại lợi ích nhiều nhất cho khối lượng công việc Python thuần túy.
Hơn nữa, các số liệu hiệu suất hoạt động là một giá trị trung bình hình học. Ngay cả trong các điểm chuẩn hiệu suất hoạt động, một số điểm chuẩn nhất định đã chậm lại một chút, trong khi những điểm chuẩn khác đã tăng tốc gần gấp đôi!
Có trình biên dịch JIT không?¶
Không. Chúng tôi vẫn đang khám phá các cách tối ưu hóa khác.
Giới thiệu¶
CPython nhanh hơn khám phá các tối ưu hóa cho CPython. Nhóm chính được Microsoft tài trợ để làm việc toàn thời gian. Pablo Galindo Salgado cũng được Bloomberg LP tài trợ để làm việc bán thời gian cho dự án. Cuối cùng, nhiều người đóng góp là tình nguyện viên của cộng đồng.
Thay đổi mã byte CPython¶
Mã byte hiện chứa các mục nhập bộ nhớ đệm nội tuyến, có dạng hướng dẫn CACHE mới được thêm vào. Nhiều opcode mong muốn được theo sau bởi một số lượng bộ đệm chính xác và hướng dẫn trình thông dịch bỏ qua chúng khi chạy. Bộ nhớ đệm phổ biến có thể trông giống như các hướng dẫn tùy ý, vì vậy cần hết sức cẩn thận khi đọc hoặc sửa đổi mã byte thích ứng thô chứa dữ liệu được tăng tốc.
Opcode mới¶
ASYNC_GEN_WRAP,RETURN_GENERATORvàSEND, được sử dụng trong các trình tạo và đồng quy trình.COPY_FREE_VARS, giúp tránh việc cần có mã phía người gọi đặc biệt để đóng.JUMP_BACKWARD_NO_INTERRUPT, để sử dụng trong một số vòng lặp nhất định mà việc xử lý các ngắt là không mong muốn.MAKE_CELL, để tạo Đối tượng di động.CHECK_EG_MATCHvàPREP_RERAISE_STAR, để xử lý new exception groups and except* được thêm vào PEP 654.PUSH_EXC_INFO, để sử dụng trong các trình xử lý ngoại lệ.RESUME, một phiên bản không hoạt động, để kiểm tra theo dõi, gỡ lỗi và tối ưu hóa nội bộ.
Opcode được thay thế¶
(Các) Opcode được thay thế |
(Các) Opcode mới |
Ghi chú |
|---|---|---|
BINARY_*INPLACE_* |
Đã thay thế tất cả các mã nhị phân số/tại chỗ bằng một mã opcode duy nhất |
|
CALL_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
Tách riêng việc chuyển đối số cho các phương thức khỏi việc xử lý đối số từ khóa; cho phép chuyên môn hóa tốt hơn các cuộc gọi |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
Hướng dẫn thao tác ngăn xếp |
|
JUMP_IF_NOT_EXC_MATCH |
Bây giờ thực hiện kiểm tra nhưng không nhảy |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
Xem [3]; Các biến thể |
|
SETUP_WITHSETUP_ASYNC_WITH |
|
thiết lập khối |
Tất cả các mã nhảy hiện chỉ mang tính tương đối, bao gồm cả JUMP_IF_TRUE_OR_POP và JUMP_IF_FALSE_OR_POP hiện có. Đối số bây giờ là một phần bù so với lệnh hiện tại chứ không phải là một vị trí tuyệt đối.
Opcode đã thay đổi/xóa¶
Đã thay đổi
MATCH_CLASSvàMATCH_KEYSđể không còn đẩy giá trị boolean bổ sung để biểu thị thành công/thất bại. Thay vào đó,Nonebị đẩy vào trạng thái lỗi thay cho bộ giá trị được trích xuất.Các mã hoạt động đã thay đổi hoạt động với các ngoại lệ để phản ánh chúng hiện được biểu thị dưới dạng một mục trên ngăn xếp thay vì ba (xem gh-89874).
Đã xóa
COPY_DICT_WITHOUT_KEYS,GEN_START,POP_BLOCK,SETUP_FINALLYvàYIELD_FROM.
Không được dùng nữa¶
Phần này liệt kê các API Python không được dùng nữa trong Python 3.11.
API C không được dùng nữa là listed separately.
Ngôn ngữ/Tích hợp¶
Chuỗi mô tả
classmethod(được giới thiệu trong bpo-19072) hiện không được dùng nữa. Nó không còn có thể được sử dụng để bao bọc các bộ mô tả khác nhưproperty. Thiết kế cốt lõi của tính năng này có sai sót và gây ra một số vấn đề về sau. Để "chuyển qua"classmethod, hãy cân nhắc sử dụng thuộc tính__wrapped__đã được thêm vào Python 3.10. (Được đóng góp bởi Raymond Hettinger trong gh-89519.)Thoát bát phân trong chuỗi và byte bằng chữ có giá trị lớn hơn
0o377(255 ở dạng thập phân) hiện tạo raDeprecationWarning. Trong phiên bản Python tương lai, họ sẽ đưa raSyntaxWarningvà cuối cùng làSyntaxError. (Được đóng góp bởi Serhiy Storchaka trong gh-81548.)Việc ủy quyền
int()đến__trunc__()hiện không còn được dùng nữa. Gọiint(a)khitype(a)triển khai__trunc__()chứ không phải__int__()hay__index__()giờ sẽ tăngDeprecationWarning. (Được đóng góp bởi Zackery Spytz trong bpo-44977.)
Mô-đun¶
PEP 594 đã dẫn đến việc ngừng sử dụng các mô-đun sau dự kiến bị xóa trong Python 3.13:
aifcchunkmsilibpipestelnetlibaudioopcryptnissndhdruucgiimghdrnntplibspwdxdrlibcgitbmailcapossaudiodevsunau(Được đóng góp bởi Brett Cannon trong bpo-47061 và Victor Stinner trong gh-68966.)
Các mô-đun
asynchat,asyncorevàsmtpdđã không còn được dùng nữa kể từ ít nhất là Python 3.6. Tài liệu và cảnh báo không dùng nữa của họ hiện đã được cập nhật để lưu ý rằng chúng sẽ bị xóa trong Python 3.12. (Được đóng góp bởi Hugo van Kemenade trong bpo-47022.)Gói
lib2to3và công cụ2to3hiện không được dùng nữa và có thể không phân tích được Python 3.10 hoặc mới hơn. Xem PEP 617, giới thiệu trình phân tích cú pháp PEG mới để biết chi tiết. (Được đóng góp bởi Victor Stinner trong bpo-40360.)Các mô-đun không có giấy tờ
sre_compile,sre_constantsvàsre_parsehiện không được dùng nữa. (Được đóng góp bởi Serhiy Storchaka trong bpo-47152.)
Thư viện chuẩn¶
Những điều sau đây không được dùng nữa trong
configparserkể từ Python 3.2. Cảnh báo không dùng nữa của họ hiện đã được cập nhật để lưu ý rằng chúng sẽ bị xóa trong Python 3.12:lớp học
configparser.SafeConfigParserthuộc tính
configparser.ParsingError.filenamephương pháp
configparser.RawConfigParser.readfp()
(Được đóng góp bởi Hugo van Kemenade trong bpo-45173.)
configparser.LegacyInterpolationkhông được dùng nữa trong chuỗi tài liệu kể từ Python 3.2 và không được liệt kê trong tài liệuconfigparser. Bây giờ nó phát raDeprecationWarningvà sẽ bị xóa trong Python 3.13. Thay vào đó hãy sử dụngconfigparser.BasicInterpolationhoặcconfigparser.ExtendedInterpolation. (Được đóng góp bởi Hugo van Kemenade trong bpo-46607.)Bộ hàm
importlib.resourcescũ hơn không được dùng nữa để thay thế bằng các hàm thay thế được thêm vào trong Python 3.9 và sẽ bị xóa trong phiên bản Python trong tương lai do không hỗ trợ các tài nguyên nằm trong thư mục con của gói:importlib.resources.contents()importlib.resources.is_resource()importlib.resources.open_binary()importlib.resources.open_text()importlib.resources.read_binary()importlib.resources.read_text()importlib.resources.path()
Hàm
locale.getdefaultlocale()không được dùng nữa và sẽ bị xóa trong Python 3.15. Thay vào đó, hãy sử dụng các hàmlocale.setlocale(),locale.getpreferredencoding(False)vàlocale.getlocale(). (Được đóng góp bởi Victor Stinner trong gh-90817.)Hàm
locale.resetlocale()không được dùng nữa và sẽ bị xóa trong Python 3.13. Thay vào đó hãy sử dụnglocale.setlocale(locale.LC_ALL, ""). (Được đóng góp bởi Victor Stinner trong gh-90817.)Các quy tắc chặt chẽ hơn hiện sẽ được áp dụng cho các tham chiếu nhóm số và tên nhóm trong regular expressions. Giờ đây, chỉ các chuỗi chữ số ASCII mới được chấp nhận làm tham chiếu số và tên nhóm trong mẫu
bytesvà chuỗi thay thế chỉ có thể chứa các chữ cái, chữ số và dấu gạch dưới ASCII. Hiện tại, cảnh báo không dùng nữa được đưa ra đối với cú pháp vi phạm các quy tắc này. (Được đóng góp bởi Serhiy Storchaka trong gh-91760.)Trong mô-đun
re, hàmre.template()và các cờre.TEMPLATEvàre.Ttương ứng không được dùng nữa vì chúng không có giấy tờ và thiếu mục đích rõ ràng. Chúng sẽ bị xóa trong Python 3.13. (Được đóng góp bởi Serhiy Storchaka và Miro Hrončok trong gh-92728.)turtle.settiltangle()đã không được dùng nữa kể từ Python 3.1; hiện tại nó phát ra cảnh báo không dùng nữa và sẽ bị xóa trong Python 3.13. Thay vào đó, hãy sử dụngturtle.tiltangle()(trước đó nó bị đánh dấu không chính xác là không được dùng nữa và chuỗi tài liệu của nó hiện đã được sửa). (Được đóng góp bởi Hugo van Kemenade trong bpo-45837.)typing.Text, chỉ tồn tại để cung cấp hỗ trợ tương thích giữa mã Python 2 và Python 3, hiện không được dùng nữa. Việc loại bỏ nó hiện chưa được lên kế hoạch, nhưng người dùng được khuyến khích sử dụngstrbất cứ khi nào có thể. (Được đóng góp bởi Alex Waygood trong gh-92332.)Cú pháp đối số từ khóa để xây dựng các loại
typing.TypedDicthiện không được dùng nữa. Hỗ trợ sẽ bị xóa trong Python 3.13. (Được đóng góp bởi Jingchen Ye trong gh-90224.)webbrowser.MacOSXkhông được dùng nữa và sẽ bị xóa trong Python 3.13. Nó chưa được kiểm tra, không có giấy tờ và không đượcwebbrowsersử dụng. (Được đóng góp bởi Donghee Na trong bpo-42255.)Hành vi trả về giá trị từ phương thức kiểm tra
TestCasevàIsolatedAsyncioTestCase(khác với giá trịNonemặc định) hiện không được dùng nữa.Không dùng nữa các hàm
unittestkhông được ghi chép chính thức sau đây, được lên lịch xóa trong Python 3.13:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()
Thay vào đó hãy sử dụng các phương thức
TestLoader:(Được đóng góp bởi Erlend E. Aasland trong bpo-5846.)
unittest.TestProgram.usageExit()được đánh dấu là không dùng nữa và sẽ bị xóa trong phiên bản 3.13. (Được đóng góp bởi Carlos Damázio trong gh-67048.)
Đang chờ xóa trong Python 3.12¶
Các API Python sau đây không được dùng nữa trong các bản phát hành Python trước đó và sẽ bị xóa trong Python 3.12.
API C đang chờ xóa là listed separately.
Mô-đun
asynchatMô-đun
asyncoreMô-đun
impKhông gian tên
typing.ioKhông gian tên
typing.recgi.log()importlib.find_loader()importlib.abc.Loader.module_repr()importlib.abc.MetaPathFinder.find_module()importlib.abc.PathEntryFinder.find_loader()importlib.abc.PathEntryFinder.find_module()importlib.machinery.BuiltinImporter.find_module()importlib.machinery.BuiltinLoader.module_repr()importlib.machinery.FileFinder.find_loader()importlib.machinery.FileFinder.find_module()importlib.machinery.FrozenImporter.find_module()importlib.machinery.FrozenLoader.module_repr()importlib.machinery.PathFinder.find_module()importlib.machinery.WindowsRegistryFinder.find_module()importlib.util.module_for_loader()importlib.util.set_loader_wrapper()importlib.util.set_package_wrapper()pkgutil.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()biến môi trường
PYTHONTHREADDEBUGCác bí danh không được dùng nữa trong
unittest:Bí danh không được dùng nữa
Tên phương thức
Không được dùng nữa ở
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3,5
Đã xóa¶
Phần này liệt kê các API Python đã bị xóa trong Python 3.11.
API C đã bị xóa là listed separately.
Đã xóa
@asyncio.coroutine()decorator cho phép các coroutine dựa trên trình tạo cũ tương thích với mãasync/await. Hàm này không được dùng nữa kể từ Python 3.8 và việc xóa ban đầu được lên lịch cho Python 3.10. Thay vào đó hãy sử dụngasync def. (Được đóng góp bởi Illia Volochii trong bpo-43216.)Đã xóa
asyncio.coroutines.CoroWrapperdùng để gói các đối tượng coroutine dựa trên trình tạo cũ ở chế độ gỡ lỗi. (Được đóng góp bởi Illia Volochii trong bpo-43216.)Do những lo ngại đáng kể về bảo mật, tham số reuse_address của
asyncio.loop.create_datagram_endpoint(), bị vô hiệu hóa trong Python 3.9, hiện đã bị xóa hoàn toàn. Điều này là do hoạt động của tùy chọn ổ cắmSO_REUSEADDRtrong UDP. (Được đóng góp bởi Hugo van Kemenade trong bpo-45129.)Đã xóa mô-đun
binhex, không được dùng nữa trong Python 3.9. Đồng thời xóa các hàmbinasciicó liên quan, không được dùng nữa:binascii.a2b_hqx()binascii.b2a_hqx()binascii.rlecode_hqx()binascii.rldecode_hqx()
Chức năng
binascii.crc_hqx()vẫn khả dụng.(Được đóng góp bởi Victor Stinner trong bpo-45085.)
Đã xóa lệnh
distutilsbdist_msikhông được dùng nữa trong Python 3.9. Thay vào đó hãy sử dụngbdist_wheel(gói bánh xe). (Được đóng góp bởi Hugo van Kemenade trong bpo-45124.)Đã xóa các phương thức
__getitem__()củaxml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrappervàfileinput.FileInput, không được dùng nữa kể từ Python 3.9. (Được đóng góp bởi Hugo van Kemenade trong bpo-45132.)Đã xóa các hàm
gettextkhông được dùng nữa làlgettext(),ldgettext(),lngettext()vàldngettext(). Đồng thời, loại bỏ hàmbind_textdomain_codeset(), các phương thứcNullTranslations.output_charset()vàNullTranslations.set_output_charset()cũng như tham số codeset củatranslation()vàinstall(), vì chúng chỉ được sử dụng cho các hàml*gettext(). (Được đóng góp bởi Donghee Na và Serhiy Storchaka trong bpo-44235.)Đã xóa khỏi mô-đun
inspect:Hàm
getargspec(), không được dùng nữa kể từ Python 3.0; thay vào đó hãy sử dụnginspect.signature()hoặcinspect.getfullargspec().Hàm
formatargspec(), không được dùng nữa kể từ Python 3.5; sử dụng trực tiếp hàminspect.signature()hoặc đối tượnginspect.Signature.Các phương thức
Signature.from_builtin()vàSignature.from_function()không có giấy tờ, không được dùng nữa kể từ Python 3.5; thay vào đó hãy sử dụng phương phápSignature.from_callable().
(Được đóng góp bởi Hugo van Kemenade trong bpo-45320.)
Đã xóa phương thức
__class_getitem__()khỏipathlib.PurePathvì nó không được sử dụng và thêm nhầm vào các phiên bản trước. (Được đóng góp bởi Nikita Sobolev trong bpo-46483.)Đã xóa lớp
MailmanProxytrong mô-đunsmtpdvì nó không thể sử dụng được nếu không có góimailmanbên ngoài. (Được đóng góp bởi Donghee Na trong bpo-35800.)Đã xóa phương thức
split()không được dùng nữa của_tkinter.TkappType. (Được đóng góp bởi Erlend E. Aasland trong bpo-38371.)Đã xóa hỗ trợ gói không gian tên khỏi khám phá
unittest. Nó được giới thiệu trong Python 3.4 nhưng đã bị hỏng kể từ Python 3.7. (Được đóng góp bởi Inada Naoki trong bpo-23882.)Đã xóa phương thức
float.__set_format__()riêng tư không có giấy tờ, trước đây gọi làfloat.__setformat__()trong Python 3.7. Chuỗi tài liệu của nó cho biết: "Có thể bạn không muốn sử dụng hàm này. Nó tồn tại chủ yếu để sử dụng trong bộ thử nghiệm của Python." (Được đóng góp bởi Victor Stinner trong bpo-46852.)Cờ cấu hình
--experimental-isolated-subinterpreters(và macroEXPERIMENTAL_ISOLATED_SUBINTERPRETERStương ứng) đã bị xóa.Pynche --- Trình chỉnh sửa Màu sắc và Màu sắc tự nhiên của Python --- đã được chuyển ra khỏi
Tools/scriptsvà là being developed independently từ cây nguồn Python.
Chuyển sang Python 3.11¶
Phần này liệt kê các thay đổi được mô tả trước đây và các bản sửa lỗi khác trong API Python có thể yêu cầu thay đổi mã Python của bạn.
Ghi chú chuyển cho C API là listed separately.
open(),io.open(),codecs.open()vàfileinput.FileInputkhông còn chấp nhận'U'("dòng mới chung") ở chế độ tệp. Trong Python 3, chế độ "dòng mới phổ quát" được sử dụng theo mặc định bất cứ khi nào tệp được mở ở chế độ văn bản và cờ'U'không được dùng nữa kể từ Python 3.3. Zz004zz cho các chức năng này kiểm soát cách hoạt động của các dòng mới phổ biến. (Được đóng góp bởi Victor Stinner trong bpo-37330.)Vị trí nút
ast.ASThiện được xác thực khi được cung cấp chocompile()và các chức năng liên quan khác. Nếu phát hiện vị trí không hợp lệ,ValueErrorsẽ được nâng lên. (Được đóng góp bởi Pablo Galindo trong gh-93351)Cấm chuyển các trình thực thi không phải
concurrent.futures.ThreadPoolExecutorsangasyncio.loop.set_default_executor()sau khi Python 3.8 không được dùng nữa. (Được đóng góp bởi Illia Volochii trong bpo-43234.)calendar: Các lớpcalendar.LocaleTextCalendarvàcalendar.LocaleHTMLCalendarhiện sử dụnglocale.getlocale(), thay vì sử dụnglocale.getdefaultlocale(), nếu không có ngôn ngữ nào được chỉ định. (Được đóng góp bởi Victor Stinner trong bpo-46659.)Mô-đun
pdbhiện đọc tệp cấu hình.pdbrcvới mã hóa'UTF-8'. (Được đóng góp bởi Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) trên bpo-41137.)Tham số population của
random.sample()phải là một chuỗi và việc chuyển đổi tự độngsets thànhlists không còn được hỗ trợ. Ngoài ra, nếu kích thước mẫu lớn hơn kích thước tổng thể thìValueErrorsẽ tăng lên. (Được đóng góp bởi Raymond Hettinger trong bpo-40465.)Tham số tùy chọn random của
random.shuffle()đã bị xóa. Trước đây nó là một hàm ngẫu nhiên tùy ý được sử dụng để xáo trộn; bây giờ,random.random()(mặc định trước đó) sẽ luôn được sử dụng.Trong
reCú pháp biểu thức chính quy, cờ nội tuyến toàn cầu (ví dụ:(?i)) hiện chỉ có thể được sử dụng khi bắt đầu biểu thức chính quy. Việc sử dụng chúng ở những nơi khác đã không được dùng nữa kể từ Python 3.6. (Được đóng góp bởi Serhiy Storchaka trong bpo-47066.)Trong mô-đun
re, một số lỗi tồn tại lâu đời đã được sửa, trong một số trường hợp hiếm hoi, có thể khiến các nhóm chụp nhận được kết quả sai. Do đó, điều này có thể thay đổi đầu ra được ghi lại trong những trường hợp này. (Được đóng góp bởi Ma Lin trong bpo-35859.)
Xây dựng thay đổi¶
CPython hiện có PEP 11 Tier 3 support để biên dịch chéo sang nền tảng WebAssembly Emscripten (
wasm32-unknown-emscripten, tức là Python trong trình duyệt) và WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Nỗ lực này được lấy cảm hứng từ tác phẩm trước đó như Pyodide. Các nền tảng này cung cấp một tập hợp con giới hạn các API POSIX; Các tính năng và mô-đun của thư viện chuẩn Python liên quan đến mạng, quy trình, phân luồng, tín hiệu, mmap và người dùng/nhóm không có sẵn hoặc không hoạt động. (Emscripten do Christian Heimes và Ethan Smith đóng góp trong gh-84461 và WASI do Christian Heimes đóng góp trong gh-90473; nền tảng được quảng cáo trong gh-95085)Xây dựng CPython hiện yêu cầu:
Macro
Py_NO_NANđã bị xóa. Vì CPython hiện yêu cầu số float IEEE 754 nên giá trị NaN luôn có sẵn. (Được đóng góp bởi Victor Stinner trong bpo-46656.)Gói
tkinterhiện yêu cầu Tcl/Tk phiên bản 8.5.12 trở lên. (Được đóng góp bởi Serhiy Storchaka trong bpo-46996.)Xây dựng các phần phụ thuộc, cờ trình biên dịch và cờ liên kết cho hầu hết các mô-đun mở rộng stdlib hiện được configure phát hiện. Các cờ libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk và uuid được phát hiện bởi pkg-config (khi khả dụng).
tkinterhiện yêu cầu lệnh pkg-config để phát hiện cài đặt phát triển cho các tiêu đề và thư viện Tcl/Tk. (Được đóng góp bởi Christian Heimes và Erlend Egeberg Aasland trong bpo-45847, bpo-45747 và bpo-45763.)libpython không còn được liên kết với libcrypt nữa. (Được đóng góp bởi Mike Gilbert trong bpo-45433.)
CPython hiện có thể được xây dựng với tùy chọn ThinLTO thông qua việc chuyển
thinsang--with-lto, tức là--with-lto=thin. (Được đóng góp bởi Donghee Na và Brett Holman trong bpo-44340.)Danh sách tự do cho cấu trúc đối tượng hiện có thể bị vô hiệu hóa. Tùy chọn configure mới
--without-freelistscó thể được sử dụng để vô hiệu hóa tất cả các danh sách tự do ngoại trừ bộ dữ liệu đơn lẻ trống. (Được đóng góp bởi Christian Heimes trong bpo-45522.)Modules/SetupvàModules/makesetupđã được cải tiến và gắn kết. Các mô-đun mở rộng hiện có thể được xây dựng thông quamakesetup. Tất cả ngoại trừ một số mô-đun thử nghiệm có thể được liên kết tĩnh vào một thư viện hoặc nhị phân chính. (Được đóng góp bởi Brett Cannon và Christian Heimes trong bpo-45548, bpo-45570, bpo-45571 và bpo-43974.)Ghi chú
Sử dụng các biến môi trường
TCLTK_CFLAGSvàTCLTK_LIBSđể chỉ định thủ công vị trí của các tiêu đề và thư viện Tcl/Tk. Các tùy chọn configure--with-tcltk-includesvà--with-tcltk-libsđã bị xóa.Trên RHEL 7 và CentOS 7, các gói phát triển không cung cấp
tcl.pcvàtk.pc; sử dụngTCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". Thư mụcMisc/rhel7chứa các tệp.pcvà hướng dẫn về cách xây dựng Python với Tcl/Tk và OpenSSL của RHEL 7 và CentOS 7.CPython bây giờ sẽ sử dụng các chữ số 30 bit theo mặc định để triển khai Python
int. Trước đây, mặc định là sử dụng các chữ số 30 bit trên nền tảng cóSIZEOF_VOID_P >= 8và các chữ số 15 bit khác. Vẫn có thể yêu cầu rõ ràng việc sử dụng các chữ số 15 bit thông qua tùy chọn--enable-big-digitscho tập lệnh cấu hình hoặc (đối với Windows) biếnPYLONG_BITS_IN_DIGITtrongPC/pyconfig.h, nhưng tùy chọn này có thể bị xóa vào một thời điểm nào đó trong tương lai. (Được đóng góp bởi Mark Dickinson trong bpo-45569.)
C API Thay đổi¶
Tính năng mới¶
Thêm chức năng
PyType_GetName()mới để lấy tên viết tắt của loại. (Được đóng góp bởi Hai Shi trong bpo-42035.)Thêm chức năng
PyType_GetQualName()mới để lấy tên đủ điều kiện của loại. (Được đóng góp bởi Hai Shi trong bpo-42035.)Thêm các chức năng
PyThreadState_EnterTracing()vàPyThreadState_LeaveTracing()mới vào C API giới hạn để tạm dừng và tiếp tục theo dõi cũng như lập hồ sơ. (Được đóng góp bởi Victor Stinner trong bpo-43760.)Đã thêm hằng số
Py_Versioncó cùng giá trị vớiPY_VERSION_HEX. (Được đóng góp bởi Gabriele N. Tornetta trong bpo-43931.)Py_buffervà API hiện là một phần của API giới hạn và ABI ổn định:khe cắm loại
bf_getbuffervàbf_releasebuffer
(Được đóng góp bởi Christian Heimes trong bpo-45459.)
Đã thêm chức năng
PyType_GetModuleByDef(), được sử dụng để lấy mô-đun trong đó một phương thức đã được xác định, trong trường hợp thông tin này không có sẵn trực tiếp (thông quaPyCMethod). (Được đóng góp bởi Petr Viktorin trong bpo-46613.)Thêm chức năng mới để đóng gói và giải nén C double (serialize và deserialize):
PyFloat_Pack2(),PyFloat_Pack4(),PyFloat_Pack8(),PyFloat_Unpack2(),PyFloat_Unpack4()vàPyFloat_Unpack8(). (Được đóng góp bởi Victor Stinner trong bpo-46906.)Thêm các chức năng mới để lấy thuộc tính đối tượng khung:
PyFrame_GetBuiltins(),PyFrame_GetGenerator(),PyFrame_GetGlobals(),PyFrame_GetLasti().Đã thêm hai hàm mới để nhận và đặt phiên bản ngoại lệ đang hoạt động:
PyErr_GetHandledException()vàPyErr_SetHandledException(). Đây là những lựa chọn thay thế choPyErr_SetExcInfo()vàPyErr_GetExcInfo()hoạt động với cách biểu diễn ngoại lệ gồm 3 bộ dữ liệu kế thừa. (Được đóng góp bởi Irit Katriel trong bpo-46343.)Đã thêm thành viên
PyConfig.safe_path. (Được đóng góp bởi Victor Stinner trong gh-57684.)
Chuyển sang Python 3.11¶
Một số macro đã được chuyển đổi thành các hàm nội tuyến tĩnh để tránh macro pitfalls. Sự thay đổi hầu như phải rõ ràng đối với người dùng, vì các hàm thay thế sẽ chuyển đối số của chúng sang loại dự kiến để tránh cảnh báo của trình biên dịch do kiểm tra kiểu tĩnh. Tuy nhiên, khi C API giới hạn được đặt thành >=3,11, các lần chuyển đổi này chưa được thực hiện và người gọi sẽ cần chuyển các đối số theo loại dự kiến của họ. Xem PEP 670 để biết thêm chi tiết. (Được đóng góp bởi Victor Stinner và Erlend E. Aasland trong gh-89653.)
PyErr_SetExcInfo()không còn sử dụng các đối sốtypevàtracebacknữa, trình thông dịch hiện lấy các giá trị đó từ phiên bản ngoại lệ (đối sốvalue). Hàm vẫn lấy tham chiếu của cả ba đối số. (Được đóng góp bởi Irit Katriel trong bpo-45711.)PyErr_GetExcInfo()hiện lấy các trườngtypevàtracebackcủa kết quả từ phiên bản ngoại lệ (trườngvalue). (Được đóng góp bởi Irit Katriel trong bpo-45711.)_frozencó trườngis_packagemới để cho biết mô-đun bị đóng băng có phải là một gói hay không. Trước đây, giá trị âm trong trườngsizelà chỉ báo. Bây giờ chỉ sử dụng các giá trị không âm chosize. (Được đóng góp bởi Kumar Aditya trong bpo-46608.)_PyFrameEvalFunction()hiện lấy_PyInterpreterFrame*làm tham số thứ hai, thay vìPyFrameObject*. Xem PEP 523 để biết thêm chi tiết về cách sử dụng loại con trỏ hàm này.PyCode_New()vàPyCode_NewWithPosOnlyArgs()hiện có thêm đối sốexception_table. Nên tránh sử dụng các chức năng này nếu có thể. Để có được một đối tượng mã tùy chỉnh: tạo một đối tượng mã bằng trình biên dịch, sau đó lấy phiên bản sửa đổi bằng phương thứcreplace.PyCodeObjectkhông còn có các trườngco_code,co_varnames,co_cellvarsvàco_freevars. Thay vào đó, hãy sử dụngPyCode_GetCode(),PyCode_GetVarnames(),PyCode_GetCellvars()vàPyCode_GetFreevars()tương ứng để truy cập chúng thông qua C API. (Được đóng góp bởi Brandt Bucher trong bpo-46841 và Ken Jin trong gh-92154 và gh-94936.)Các macro thùng rác cũ (
Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) hiện không được dùng nữa. Chúng nên được thay thế bằng macro mớiPy_TRASHCAN_BEGINvàPy_TRASHCAN_END.Hàm tp_dealloc có các macro cũ, chẳng hạn như:
khoảng trống tĩnh mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
nên di chuyển sang các macro mới như sau:
khoảng trống tĩnh mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Lưu ý rằng
Py_TRASHCAN_BEGINcó đối số thứ hai sẽ là hàm phân bổ mà nó có trong đó.Để hỗ trợ các phiên bản Python cũ hơn trong cùng một cơ sở mã, bạn có thể xác định các macro sau và sử dụng chúng trong toàn bộ mã (tín dụng: các macro này được sao chép từ cơ sở mã
mypy):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
Hàm
PyType_Ready()hiện phát sinh lỗi nếu một loại được xác định bằng bộ cờPy_TPFLAGS_HAVE_GCnhưng không có chức năng duyệt ngang (PyTypeObject.tp_traverse). (Được đóng góp bởi Victor Stinner trong bpo-44263.)Các loại heap có cờ
Py_TPFLAGS_IMMUTABLETYPEhiện có thể kế thừa giao thức vectorcall PEP 590. Trước đây, điều này chỉ có thể thực hiện được với static types. (Được đóng góp bởi Erlend E. Aasland trong bpo-43908)Vì
Py_TYPE()được thay đổi thành hàm tĩnh nội tuyến, nênPy_TYPE(obj) = new_typephải được thay thế bằngPy_SET_TYPE(obj, new_type): xem hàmPy_SET_TYPE()(có sẵn từ Python 3.9). Để tương thích ngược, macro này có thể được sử dụng#if PY_VERSION_HEX < 0x030900A4 && ! đã xác định(Py_SET_TYPE) khoảng trống nội tuyến tĩnh _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = loại; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(Được đóng góp bởi Victor Stinner trong bpo-39573.)
Vì
Py_SIZE()được thay đổi thành hàm tĩnh nội tuyến, nênPy_SIZE(obj) = new_sizephải được thay thế bằngPy_SET_SIZE(obj, new_size): xem hàmPy_SET_SIZE()(có sẵn từ Python 3.9). Để tương thích ngược, macro này có thể được sử dụng#if PY_VERSION_HEX < 0x030900A4 && !được xác định(Py_SET_SIZE) void nội tuyến tĩnh _Py_SET_SIZE(PyVarObject *ob, kích thước Py_ssize_t) { ob->ob_size = kích thước; } #define Py_SET_SIZE(ob, kích thước) _Py_SET_SIZE((PyVarObject*)(ob), kích thước) #endif
(Được đóng góp bởi Victor Stinner trong bpo-39573.)
<Python.h>không còn bao gồm các tệp tiêu đề<stdlib.h>,<stdio.h>,<errno.h>và<string.h>khi macroPy_LIMITED_APIđược đặt thành0x030b0000(Python 3.11) trở lên. Tiện ích mở rộng C phải bao gồm rõ ràng các tệp tiêu đề sau#include <Python.h>. (Được đóng góp bởi Victor Stinner trong bpo-45434.)Các tệp API không giới hạn
cellobject.h,classobject.h,code.h,context.h,funcobject.h,genobject.hvàlongintrepr.hđã được chuyển đến thư mụcInclude/cpython. Hơn nữa, tệp tiêu đềeval.hđã bị xóa. Không được đưa trực tiếp các tệp này vào vì chúng đã được đưa vàoPython.h: Include Files. Nếu chúng đã được đưa trực tiếp vào, thay vào đó hãy xem xét việc đưa vàoPython.h. (Được đóng góp bởi Victor Stinner trong bpo-35134.)Macro
PyUnicode_CHECK_INTERNED()đã bị loại khỏi C API giới hạn. Nó không bao giờ có thể sử dụng được ở đó vì nó sử dụng các cấu trúc bên trong không có sẵn trong C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-46007.)Các chức năng và loại khung sau hiện có sẵn trực tiếp với
#include <Python.h>, không cần thêm#include <frameobject.h>nữa:(Được đóng góp bởi Victor Stinner trong gh-93937.)
Các thành viên cấu trúc
PyFrameObjectđã bị xóa khỏi C API công khai.Mặc dù tài liệu lưu ý rằng các trường
PyFrameObjectcó thể thay đổi bất kỳ lúc nào nhưng chúng đã ổn định trong một thời gian dài và được sử dụng trong một số tiện ích mở rộng phổ biến.Trong Python 3.11, cấu trúc khung được tổ chức lại để cho phép tối ưu hóa hiệu suất. Một số trường đã bị xóa hoàn toàn vì chúng là chi tiết của cách triển khai cũ.
trường
PyFrameObject:f_back: sử dụngPyFrame_GetBack().f_blockstack: đã xóa.f_builtins: sử dụngPyFrame_GetBuiltins().f_code: sử dụngPyFrame_GetCode().f_gen: sử dụngPyFrame_GetGenerator().f_globals: sử dụngPyFrame_GetGlobals().f_iblock: đã xóa.f_lasti: sử dụngPyFrame_GetLasti(). Mã sử dụngf_lastivớiPyCode_Addr2Line()nên sử dụngPyFrame_GetLineNumber()thay thế; nó có thể nhanh hơn.f_lineno: sử dụngPyFrame_GetLineNumber()f_locals: sử dụngPyFrame_GetLocals().f_stackdepth: đã xóa.f_state: không có API công khai (đổi tên thànhf_frame.f_state).f_trace: không có API công khai.f_trace_lines: sử dụngPyObject_GetAttrString((PyObject*)frame, "f_trace_lines").f_trace_opcodes: sử dụngPyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes").f_localsplus: không có API công khai (đổi tên thànhf_frame.localsplus).f_valuestack: đã xóa.
Đối tượng khung Python hiện được tạo một cách lười biếng. Một tác dụng phụ là thành viên
f_backkhông được truy cập trực tiếp vì giá trị của nó giờ đây cũng được tính toán một cách lười biếng. Thay vào đó, hàmPyFrame_GetBack()phải được gọi.Thay vào đó, các trình gỡ lỗi đã truy cập trực tiếp vào
f_localsmust hãy gọiPyFrame_GetLocals(). Họ không cần gọiPyFrame_FastToLocalsWithError()hayPyFrame_LocalsToFast()nữa, thực tế là họ không nên gọi những hàm đó. Việc cập nhật khung cần thiết hiện được quản lý bởi máy ảo.Mã xác định
PyFrame_GetCode()trên Python 3.8 trở lên#if PY_VERSION_HEX < 0x030900B1 nội tuyến tĩnh PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(khung->f_code); khung trả về->f_code; } #endif
Mã xác định
PyFrame_GetBack()trên Python 3.8 trở lên#if PY_VERSION_HEX < 0x030900B1 nội tuyến tĩnh PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(khung->f_back); khung trả về->f_back; } #endif
Hoặc sử dụng pythoncapi_compat project để nhận hai hàm này trên các phiên bản Python cũ hơn.
Thay đổi của các thành viên cấu trúc
PyThreadState:frame: đã xóa, sử dụngPyThreadState_GetFrame()(chức năng được thêm vào Python 3.9 bởi bpo-40429). Cảnh báo: hàm trả về strong reference, cần gọiPy_XDECREF().tracing: đã thay đổi, sử dụngPyThreadState_EnterTracing()vàPyThreadState_LeaveTracing()(các hàm được thêm vào Python 3.11 bởi bpo-43760).recursion_depth: đã xóa, thay vào đó hãy sử dụng(tstate->recursion_limit - tstate->recursion_remaining).stackcheck_counter: đã xóa.
Mã xác định
PyThreadState_GetFrame()trên Python 3.8 trở lên#if PY_VERSION_HEX < 0x030900B1 nội tuyến tĩnh PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); trả về tstate->frame; } #endif
Mã xác định
PyThreadState_EnterTracing()vàPyThreadState_LeaveTracing()trên Python 3.10 trở lên#if PY_VERSION_HEX < 0x030B00A2 khoảng trống nội tuyến tĩnh PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } khoảng trống nội tuyến tĩnh PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->truy tìm--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
Hoặc sử dụng the pythoncapi-compat project để nhận các hàm này trên các hàm Python cũ.
Các nhà phân phối được khuyến khích xây dựng Python với thư viện Blake2 libb2 được tối ưu hóa.
Trường
PyConfig.module_search_paths_sethiện phải được đặt thành 1 để khởi tạo để sử dụngPyConfig.module_search_pathskhởi tạosys.path. Nếu không, quá trình khởi tạo sẽ tính toán lại đường dẫn và thay thế mọi giá trị được thêm vàomodule_search_paths.PyConfig_Read()không còn tính toán đường dẫn tìm kiếm ban đầu và sẽ không điền bất kỳ giá trị nào vàoPyConfig.module_search_paths. Để tính toán các đường dẫn mặc định và sau đó sửa đổi chúng, hãy hoàn tất quá trình khởi tạo và sử dụngPySys_GetObject()để truy xuấtsys.pathdưới dạng đối tượng danh sách Python và sửa đổi trực tiếp.
Không được dùng nữa¶
Không dùng các hàm sau để định cấu hình khởi tạo Python:
PySys_AddWarnOptionUnicode()PySys_AddWarnOption()PySys_AddXOption()PySys_HasWarnOptions()PySys_SetArgvEx()PySys_SetArgv()PySys_SetPath()Py_SetPath()Py_SetProgramName()Py_SetPythonHome()Py_SetStandardStreamEncoding()_Py_SetProgramFullPath()
Thay vào đó hãy sử dụng
PyConfigAPI mới của Python Initialization Configuration (PEP 587). (Được đóng góp bởi Victor Stinner trong gh-88279.)Không dùng nữa thành viên
ob_shashcủaPyBytesObject. Thay vào đó hãy sử dụngPyObject_Hash(). (Được đóng góp bởi Inada Naoki trong bpo-46864.)
Đang chờ xóa trong Python 3.12¶
Các API C sau đây không được dùng nữa trong các bản phát hành Python trước đó và sẽ bị xóa trong Python 3.12.
PyUnicode_AS_DATA()PyUnicode_AS_UNICODE()PyUnicode_AsUnicodeAndSize()PyUnicode_AsUnicode()PyUnicode_FromUnicode()PyUnicode_GET_DATA_SIZE()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_IS_COMPACT()PyUnicode_IS_READY()PyUnicode_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_InternImmortal()
Đã xóa¶
PyFrame_BlockSetup()vàPyFrame_BlockPop()đã bị xóa. (Được đóng góp bởi Mark Shannon trong bpo-40222.)Xóa các macro toán học sau bằng biến
errno:Py_ADJUST_ERANGE1()Py_ADJUST_ERANGE2()Py_OVERFLOWED()Py_SET_ERANGE_IF_OVERFLOW()Py_SET_ERRNO_ON_MATH_ERROR()
(Được đóng góp bởi Victor Stinner trong bpo-45412.)
Xóa macro
Py_UNICODE_COPY()vàPy_UNICODE_FILL(), không được dùng nữa kể từ Python 3.3. Thay vào đó, hãy sử dụng các hàmPyUnicode_CopyCharacters()hoặcmemcpy()(chuỗiwchar_t*) vàPyUnicode_Fill(). (Được đóng góp bởi Victor Stinner trong bpo-41123.)Xóa tệp tiêu đề
pystrhex.h. Nó chỉ chứa các chức năng riêng tư. Phần mở rộng C chỉ nên bao gồm tệp tiêu đề<Python.h>chính. (Được đóng góp bởi Victor Stinner trong bpo-45434.)Xóa macro
Py_FORCE_DOUBLE(). Nó được sử dụng bởi macroPy_IS_INFINITY(). (Được đóng góp bởi Victor Stinner trong bpo-45440.)Các mục sau đây không còn khả dụng khi
Py_LIMITED_APIđược xác định:macro
Py_MARSHAL_VERSION
Đây không phải là một phần của limited API.
(Được đóng góp bởi Victor Stinner trong bpo-45474.)
Loại trừ
PyWeakref_GET_OBJECT()khỏi C API giới hạn. Nó không bao giờ hoạt động vì cấu trúcPyWeakReferencemờ đục trong C API giới hạn. (Được đóng góp bởi Victor Stinner trong bpo-35134.)Xóa macro
PyHeapType_GET_MEMBERS(). Nó đã bị lộ ra trong C API công khai do nhầm lẫn, nó chỉ được sử dụng bởi Python trong nội bộ. Thay vào đó hãy sử dụng thành viênPyTypeObject.tp_members. (Được đóng góp bởi Victor Stinner trong bpo-40170.)Xóa macro
HAVE_PY_SET_53BIT_PRECISION(đã chuyển sang C API bên trong). (Được đóng góp bởi Victor Stinner trong bpo-45412.)
Xóa API bộ mã hóa
Py_UNICODEvì chúng không được dùng nữa kể từ Python 3.3, ít được sử dụng và không hiệu quả so với các lựa chọn thay thế được đề xuất.Các chức năng bị loại bỏ là:
PyUnicode_Encode()PyUnicode_EncodeASCII()PyUnicode_EncodeLatin1()PyUnicode_EncodeUTF7()PyUnicode_EncodeUTF8()PyUnicode_EncodeUTF16()PyUnicode_EncodeUTF32()PyUnicode_EncodeUnicodeEscape()PyUnicode_EncodeRawUnicodeEscape()PyUnicode_EncodeCharmap()PyUnicode_TranslateCharmap()PyUnicode_EncodeDecimal()PyUnicode_TransformDecimalToASCII()
Xem PEP 624 để biết chi tiết và migration guidance. (Được đóng góp bởi Inada Naoki trong bpo-44029.)
Những thay đổi đáng chú ý trong 3.11.4¶
hồ dầu¶
Các phương thức trích xuất trong
tarfilevàshutil.unpack_archive()có một đối số filter mới cho phép hạn chế các tính năng tar có thể gây ngạc nhiên hoặc nguy hiểm, chẳng hạn như tạo tệp bên ngoài thư mục đích. Xem Bộ lọc trích xuất để biết chi tiết. Trong Python 3.12, sử dụng không có đối số filter sẽ hiển thịDeprecationWarning. Trong Python 3.14, mặc định sẽ chuyển sang'data'. (Được đóng góp bởi Petr Viktorin trong PEP 706.)
Những thay đổi đáng chú ý trong 3.11.5¶
OpenSSL¶
Bản dựng Windows và trình cài đặt macOS từ python.org hiện sử dụng OpenSSL 3.0.