8 điểm bởi GN⁺ 2024-01-10 | 1 bình luận | Chia sẻ qua WhatsApp

Python 3.13 bổ sung trình biên dịch JIT

  • Nhà phát triển lõi CPython Brandt Bucher đã gửi một pull request để bổ sung trình biên dịch JIT vào nhánh Python 3.13.
  • Thay đổi này sẽ là một trong những thay đổi lớn nhất của trình thông dịch CPython kể từ trình thông dịch thích ứng chuyên biệt được thêm vào Python 3.11.

JIT là gì?

  • Biên dịch JIT (Just in Time) là một thiết kế trong đó việc biên dịch diễn ra khi mã được chạy lần đầu.
  • Trình biên dịch JIT là trình biên dịch tạo ra mã máy, đối lập với trình biên dịch AOT (Ahead of Time).
  • Mã Python trước tiên được biên dịch thành bytecode; bytecode này không có ý nghĩa trực tiếp với CPU và được thực thi thông qua một vòng lặp trình thông dịch bytecode chuyên biệt.

copy-and-patch JIT là gì?

  • copy-and-patch JIT là một khái niệm được đề xuất vào năm 2021, được thiết kế như một thuật toán nhanh cho runtime của ngôn ngữ động.
  • copy-and-patch JIT là ý tưởng sao chép các chỉ thị cho từng lệnh và điền (patch) các đối số bytecode.

Ưu và nhược điểm của copy-and-patch JIT

  • Trong khi trình biên dịch JIT “đầy đủ” biên dịch bytecode cấp cao thành các chỉ thị cấp thấp của ngôn ngữ trung gian (IL), thì copy-and-patch JIT thực hiện việc biên dịch từ bytecode sang mã máy bằng một tập hợp các mẫu.
  • copy-and-patch JIT không cần chạy một kiến trúc trình biên dịch JIT phức tạp bên trong runtime Python; chỉ cần cài đặt công cụ LLVM JIT trên máy dùng để biên dịch CPython từ mã nguồn.

JIT này hoạt động như thế nào?

  • Nó mở rộng API mới được bổ sung vào Python 3.13 để các trình tối ưu hóa có thể cắm được có thể được phát hiện trong runtime.
  • JIT mới là một trình tối ưu hóa tùy chọn cho kiến trúc mới này.
  • Khi biên dịch CPython từ mã nguồn, cung cấp cờ --enable-experimental-jit sẽ tạo ra các mẫu mã máy cho bytecode Python.

JIT này có nhanh hơn không?

  • Các benchmark ban đầu cho thấy mức cải thiện hiệu năng khoảng 2-9%.
  • JIT này là nền tảng cho một loạt tối ưu hóa có thể cải thiện đáng kể hiệu năng của Python.

Ý kiến của GN⁺

  • Trình biên dịch JIT được thêm vào Python 3.13 là một thay đổi quan trọng giúp cải thiện tốc độ thực thi của Python, đặc biệt có thể tăng hiệu quả cho các tác vụ lặp lại.
  • copy-and-patch JIT mang đến một cách tiếp cận đổi mới để cải thiện hiệu năng mà không cần tích hợp một kiến trúc JIT phức tạp vào runtime Python của người dùng.
  • Công nghệ này được kỳ vọng sẽ tạo ra những thảo luận thú vị trong cộng đồng Python và mở ra cánh cửa mới cho việc tối ưu hiệu năng của Python.

1 bình luận

 
GN⁺ 2024-01-10
Ý kiến Hacker News
  • Mức cải thiện hiệu năng 2-9% giữa các phiên bản phần mềm là điều đáng chú ý. Những cải thiện nhỏ như vậy đôi khi bị xem là gây thất vọng, nhưng tôi thích việc chúng liên tục tích lũy để mỗi phiên bản đều nhanh hơn phiên bản trước.
  • Thật tuyệt khi kỹ thuật 'copy-and-patch' của Haoran Xu và Fredrik Kjolstad đang được chú ý. Tôi biết đến nó lần đầu qua bài viết blog về dự án remake LuaJIT của Xu. Cách tái sử dụng kỹ thuật sẵn có để tạo ra thứ mới mẻ khiến tôi thấy rất thông minh. Tôi cũng khuyên những ai muốn tìm hiểu về triển khai ngôn ngữ nên đọc bài blog đó. Ngoài ra, Xu cũng cho biết lý do cập nhật blog chậm là vì phải làm lại phần backend.
  • Brandt đã trình bày về chủ đề này tại buổi sprint dành cho các nhà phát triển lõi CPython vào năm ngoái.
  • Bất chấp những nỗ lực trên PyPy, Jython, GraalPy và IronPython, việc JIT được bổ sung vào CPython vẫn được xem là một bước tiến quan trọng đối với hệ sinh thái Python. Đặc biệt đáng mong đợi là sự phát triển sau phiên bản 3.13.
  • Tôi dùng Python cho gần như mọi thứ ngoài phát triển web, nên nếu hiệu năng được cải thiện thì đó là tín hiệu rất tích cực. Hệ sinh thái Python đã rời xa các yêu cầu không trạng thái như CGI hay mod_php để chuyển sang các tiến trình chạy lâu dài. Điều đó có nghĩa là phải khởi động lại mỗi khi thay đổi ứng dụng web cục bộ, và một số nhà phát triển đang dùng cách tự động khởi động lại ứng dụng khi lưu tệp.
  • Tôi nhớ rằng CPython từng được định hướng là giữ codebase càng đơn giản càng tốt, còn việc tối ưu hóa sẽ do các implementation khác đảm nhiệm.
  • Bài viết giới thiệu JIT 'copy-and-patch' như một điều mới, nhưng tôi nhớ DOS QuickBASIC đã dùng cách tương tự. QuickBASIC vá các khối assembly mẫu ngay trong bộ nhớ và tạo ra mã assembly rất tệ.
  • Những tiến bộ về hiệu năng Python trong 2 năm qua thật đáng kinh ngạc. Nhóm phát triển lõi đã coi cải thiện hiệu năng là một mục tiêu nghiêm túc và đạt được những bước tiến rõ rệt.
  • Tôi muốn có thêm nguồn tài trợ cho PyPy. Nhưng với các chương trình nhỏ, thời gian khởi động nhanh của PyPy không thực sự tốt nên không mang lại lợi thế lớn. Ngoài ra, với các chương trình lớn có thể phát sinh các vấn đề tương thích phức tạp. Nếu JIT của CPython đáng tin cậy hơn hoặc có thời gian khởi động nhanh hơn, nó có thể giải quyết một phần các vấn đề đó.
  • Thông điệp PR trên kho GitHub của Python nhại theo 'Đêm trước Giáng sinh' rất dí dỏm.