Các nhà phát triển Python từ lâu đã gặp khó khăn với thời gian khởi động chậm của các công cụ dòng lệnh, thường phải chờ vài giây chỉ để xem thông báo trợ giúp. Một đề xuất mới, PEP 810 , nhằm giải quyết vấn đề này bằng cách giới thiệu lazy imports - một tính năng trì hoãn việc tải các module cho đến khi chúng thực sự cần thiết.
Đề xuất này giới thiệu từ khóa lazy đơn giản có thể được thêm trước các câu lệnh import. Thay vì tải tất cả các module khi khởi động, Python sẽ chỉ tải chúng khi mã thực sự sử dụng chúng. Điều này có thể tăng tốc đáng kể các công cụ CLI mà import các thư viện nặng như PyTorch hoặc NumPy nhưng chỉ sử dụng chúng trong các đường dẫn mã cụ thể.
Ví dụ cú pháp được đề xuất:
- Import cơ bản:
lazy import torch - From import:
lazy from numpy import array - Import có bí danh:
lazy import pandas as pd - Điều khiển toàn cục:
__lazy_modules__ = ['torch', 'pandas']
Cộng Đồng Ủng Hộ Giải Pháp
Cộng đồng Python đã phản hồi một cách nhiệt tình với đề xuất này. Nhiều nhà phát triển đã chia sẻ sự thất vọng của họ với các giải pháp tạm thời hiện tại, như di chuyển imports vào bên trong các hàm hoặc sử dụng các cơ chế lazy loading phức tạp. Một nhà phát triển đã lưu ý về việc công cụ CLI dựa trên plugin của họ bị chậm thời gian khởi động vì các plugin phổ biến import các thư viện nặng ở cấp độ module, làm chặn ngay cả các lệnh đơn giản như thông báo trợ giúp.
Đề xuất này đã học hỏi từ các nỗ lực trước đó. Một phiên bản trước đó, PEP 690 , đã bị từ chối vào năm 2022 do lo ngại về độ phức tạp khi có hai chế độ import khác nhau. Cách tiếp cận mới này giải quyết những vấn đề đó bằng cách làm cho lazy imports rõ ràng là tùy chọn và cung cấp các cơ chế kiểm soát rõ ràng.
Các Nỗ Lực Trước Đây:
- PEP 690 (2022): Bị từ chối do độ phức tạp của chế độ import kép
- Cinder của Meta : Đã triển khai lazy imports trong phiên bản Python fork sản xuất
- Các giải pháp bên thứ ba khác nhau: LazyLoader , importlib hooks, các triển khai tùy chỉnh
Cú Pháp Giữ Mọi Thứ Đơn Giản
Cú pháp được đề xuất xây dựng trên các mẫu Python quen thuộc. Các nhà phát triển sẽ viết lazy import torch thay vì import torch, hoặc lazy from numpy import array cho các import cụ thể. Tính năng này cũng bao gồm một cơ chế kiểm soát toàn cục, cho phép toàn bộ ứng dụng vô hiệu hóa lazy loading khi cần thiết - hữu ích cho việc kiểm thử hoặc môi trường sản xuất nơi hành vi khởi động có thể dự đoán quan trọng hơn tốc độ.
Một số thành viên cộng đồng đã đề xuất các cách tiếp cận thay thế, như làm cho tất cả imports lazy theo mặc định hoặc sử dụng cú pháp kiểu decorator. Tuy nhiên, đề xuất hiện tại ưu tiên khả năng tương thích ngược và kiểm soát rõ ràng hơn những thay đổi căn bản hơn.
Các Tính Năng Chính:
- Lazy loading tùy chọn với từ khóa
lazyrõ ràng - Điều khiển bật/tắt toàn cục cho toàn bộ ứng dụng
- Tương thích ngược với mã Python hiện có
- Hỗ trợ cả import module và import theo kiểu from
- Xác thực runtime của lazy imports
Sự Cân Bằng Giữa Hiệu Suất và Độ Tin Cậy
Tính năng lazy import tạo ra một sự căng thẳng thú vị giữa hiệu suất và độ tin cậy. Trong khi thời gian khởi động nhanh hơn hấp dẫn nhiều nhà phát triển, một số nhóm thích hành vi hiện tại nơi các lỗi import xảy ra ngay lập tức khi khởi động thay vì có thể xảy ra vài giờ sau đó khi các đường dẫn mã cụ thể được thực thi.
Chúng tôi có xu hướng thích các import cấp cao rõ ràng cụ thể vì chúng tiết lộ các vấn đề phụ thuộc ngay khi chương trình bắt đầu, thay vì có thể vài giờ hoặc vài ngày sau đó khi một đường dẫn mã cụ thể được thực thi.
Đề xuất này giải quyết mối lo ngại này bằng cách cung cấp các cơ chế để xác thực imports mà không thực sự tải chúng, và bằng cách cung cấp các điều khiển toàn cục để vô hiệu hóa lazy loading trong môi trường sản xuất nơi độ tin cậy quan trọng hơn tốc độ.
Những Thách Thức Triển Khai Phía Trước
Bất chấp sự nhiệt tình, vẫn còn một số thách thức kỹ thuật. Tính năng này phải xử lý hệ thống import phức tạp của Python , bao gồm circular imports, các tác dụng phụ của module, và khả năng tương thích với các công cụ hiện có như type checkers và IDEs. Đề xuất bao gồm các điều khoản cho những tình huống này, nhưng việc kiểm thử thực tế sẽ xác định chúng hoạt động tốt như thế nào trong thực tế.
Python Steering Council cuối cùng sẽ quyết định có chấp nhận đề xuất này hay không. Nếu được phê duyệt, nó có thể đánh dấu một bước quan trọng hướng tới việc làm cho Python cạnh tranh hơn cho các ứng dụng CLI và các codebase lớn nơi thời gian khởi động hiện tại tạo ra ma sát cho các nhà phát triển.
Tham khảo: PEP 690 – Explicitly-typed imports
