Những thay đổi chính của Python 3.13
- CPython v3.13.0 dự kiến phát hành vào ngày 7 tháng 10 năm 2024
- Phiên bản này bao gồm hai thay đổi lớn có thể ảnh hưởng mạnh đến hiệu năng của Python
- Phiên bản "free-threaded" cho phép vô hiệu hóa Global Interpreter Lock (GIL)
- Hỗ trợ biên dịch Just-in-Time (JIT) ở mức thử nghiệm
Global Interpreter Lock (GIL)
GIL là gì?
- Python được Guido Van Rossum thiết kế và hiện thực như một ngôn ngữ thông dịch đơn luồng vào cuối thập niên 1980
- Python biên dịch mã nguồn thành bytecode rồi trình thông dịch thực thi nó
- Để các đối tượng có thể được truy cập an toàn từ mọi luồng, Python sử dụng global lock (GIL)
- Đây là khóa loại trừ lẫn nhau toàn cục, ngăn nhiều luồng thực thi bytecode cùng lúc
- Nó hạn chế việc dùng bộ nhớ chia sẻ nhưng có lợi cho hiệu năng đơn luồng
Vì sao Python có GIL
- Vào đầu thập niên 1990, phần lớn chương trình là đơn luồng và hiệu năng của một lõi tăng rất nhanh
- Khi đó không cần phải hy sinh hiệu năng đơn luồng để đổi lấy an toàn đa luồng
- Có thể tận dụng nhiều lõi bằng cách dùng đa tiến trình (
multiprocessing module)
Vì sao bây giờ lại loại bỏ GIL?
- Các lập trình viên core của Python từ lâu đã muốn loại bỏ GIL, nhưng lo ngại suy giảm hiệu năng đơn luồng nên chưa thể thực hiện
- Gần đây, khi CPU đa lõi đã trở nên phổ biến, các hạn chế đa luồng do GIL gây ra ngày càng thành vấn đề
- Dự án "Faster CPython" do Microsoft tài trợ đã góp phần cải thiện hiệu năng Python
- Sam Gross đã đề xuất một cách hiện thực không có GIL và PEP 703 đã được chấp nhận
- Kế hoạch triển khai theo từng bước: tùy chọn thử nghiệm → hỗ trợ chính thức → chế độ mặc định
- Với bối cảnh đó, kế hoạch loại bỏ GIL theo lộ trình dần dần đã được phê duyệt
Hiệu năng ra sao?
- Khi bật free-threading, hiệu năng đơn luồng giảm khoảng 20%
- Đa luồng khi tắt GIL cho thấy mức cải thiện hiệu năng đáng kể
- Đa luồng khi bật GIL chậm hơn cả đơn luồng
- Đa luồng khi tắt GIL cho hiệu năng tương tự multiprocessing
Dùng Python free-threading như thế nào?
- Có thể dùng bản free-threading bằng cách cài Python 3.13.0rc2t với pyenv
- Theo mặc định GIL sẽ bị vô hiệu hóa, và có thể bật lại GIL lúc chạy bằng
-X gil=1
- Nếu import một module không hỗ trợ GIL-free thì GIL sẽ tự động được bật lại
Trình biên dịch JIT (Just-in-Time)
JIT là gì?
- Khác với biên dịch ahead-of-time truyền thống, đây là kỹ thuật tạo machine code ngay trước khi thực thi
- Trước Python 3.13, bytecode được chuyển từng phần sang mã máy rồi thực thi
- Với JIT, bytecode có thể được chuyển sang mã máy theo lô và cập nhật khi cần
- Kỹ thuật được đưa vào Python 3.13 là JIT kiểu "copy-and-patch", vá bytecode khớp với các template định sẵn thành native code
- Các trình biên dịch JIT tiên tiến hơn có thể tối ưu những vùng mã "hot" được chạy thường xuyên
JIT ảnh hưởng như thế nào?
- Trong ngắn hạn, sẽ chưa có thay đổi lớn trong cách viết hoặc chạy mã Python
- Tuy nhiên, kỳ vọng là hiệu năng sẽ được cải thiện dần dần để Python có thể cạnh tranh với các ngôn ngữ khác
Dùng JIT như thế nào?
- Trong Python 3.13, JIT vẫn là tính năng thử nghiệm và không được bật mặc định
- Có thể bật khi build bằng tùy chọn
PYTHON_CONFIGURE_OPTS="--enable-experimental-jit"
- Khi chạy, có thể điều khiển việc bật/tắt bằng
PYTHON_JIT=0/1
Kết luận
- Python 3.13 là một bản phát hành lớn, mang đến những khái niệm và tính năng mới rất đáng chú ý ở runtime
- Việc loại bỏ GIL và đưa vào JIT báo hiệu những thay đổi quan trọng
- Trong ngắn hạn có thể chưa có biến chuyển lớn, nhưng về dài hạn sẽ tác động tích cực đến hiệu năng Python
- Khi free-threading và JIT trưởng thành hơn, chúng được kỳ vọng sẽ tạo ảnh hưởng lớn đến hiệu năng, đặc biệt với các tác vụ CPU-bound
Ý kiến của GN⁺
- Bản cập nhật Python 3.13 lần này có vẻ sẽ mang đến thay đổi lớn cho hệ sinh thái Python. Việc loại bỏ GIL được kỳ vọng sẽ gỡ bỏ nút thắt cổ chai của multithreading, còn JIT sẽ cải thiện tốc độ thực thi tổng thể.
- Tuy vậy, sẽ cần thời gian để những thay đổi này ổn định hoàn toàn. Các vấn đề tương thích với những gói hiện có như C extension có thể phát sinh, và khi lập trình multithreading cũng có thể xuất hiện các lỗi mới như race condition.
- Tốc độ chậm vốn thường bị xem là nhược điểm của Python, và hy vọng bản cập nhật này sẽ cải thiện nhận thức đó. Nếu vẫn giữ được ưu điểm về năng suất và tính dễ đọc, đồng thời có thêm tốc độ, Python sẽ trở thành ngôn ngữ được dùng rộng rãi hơn nữa.
- Dù vậy, về bản chất Python vẫn có giới hạn của một ngôn ngữ kiểu động. Các nỗ lực để tiếp thu ưu điểm của ngôn ngữ kiểu tĩnh cũng nên được tiếp tục. Có thể phần nào giải quyết điều này bằng cách tích cực tận dụng type hinting và Cython, những thứ gần đây đã được đưa vào Python.
- Tổng thể mà nói, Python 3.13 có vẻ sẽ mang đến những thay đổi thú vị và tích cực. Hy vọng các lập trình viên sẽ hiểu rõ và tận dụng tốt các thay đổi này để xây dựng những chương trình Python tốt hơn.
3 bình luận
Việc loại bỏ GIL và JIT, dù hiện tại cả hai vẫn còn khá hạn chế, đều là những bước tiến rất quan trọng có thể thay đổi quỹ đạo của Python. Thật đáng mong đợi về tương lai của Python khi nó sẽ thoát khỏi tai tiếng là “ngôn ngữ chậm nhất” và được ứng dụng trong nhiều lĩnh vực hơn nữa.
Tầm quan trọng của free threading (loại bỏ GIL) đã được tổng hợp rất rõ trong PEP 703, kèm theo ý kiến của nhiều người.
Ngoài ra, theo PEP đó, mức suy giảm hiệu năng ở chế độ single-thread chỉ vào khoảng 5~6%, nên khá khó chấp nhận những tuyên bố trong bài viết đó và một số bình luận trên hn rằng hiệu năng giảm tới 20~50%. Cũng không có nguồn nào có thể kiểm chứng được.
Ý kiến trên Hacker News
Có ý kiến cho rằng việc loại bỏ GIL sẽ khiến các chương trình Python thông thường chậm hơn và làm tăng độ phức tạp
Có phàn nàn về việc không thể tải xuống phiên bản bật JIT
Có ý kiến cho rằng tiêu đề nghe giống vần điệu "Jack and Jill went up the hill"
Có chia sẻ rằng với các chương trình nhỏ, ít bộ nhớ và chạy trong thời gian ngắn, việc tắt garbage collection giúp tăng tốc đáng kể
Có ý kiến cho rằng đây là bản tóm tắt tốt cho những người đã thấy cuộc thảo luận đầu tiên về việc loại bỏ GIL vào năm 2021 nhưng không hài lòng với phần giải thích khi đó
Có thắc mắc liệu việc tối ưu hóa cho trường hợp không có GIL có thực sự là bất khả thi hay không
Có tin rằng ngày phát hành đã được đổi từ 2 tháng 10 sang 7 tháng 10
Có ý kiến rằng mức suy giảm hiệu năng của nogil thường được trích dẫn là 20%, nhưng thực tế có thể lên tới 50%
Có ý kiến cho rằng đây là một tiêu đề gây bất ngờ
Có câu hỏi đang tìm liên kết tới các công trình gần đây về tự động song song hóa