Không, nó không .
Quá trình biên dịch thành mã byte CPython chỉ được chuyển qua một trình tối ưu hóa lỗ nhỏ được thiết kế để chỉ thực hiện các tối ưu hóa cơ bản (Xem test_peepholer.py trong bộ thử nghiệm để biết thêm về các tối ưu hóa này).
Để xem những gì thực sự sẽ xảy ra, hãy sử dụng dis
* để xem các hướng dẫn được tạo. Đối với hàm đầu tiên, chứa phép gán:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
Trong khi, đối với chức năng thứ hai:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Hai lệnh nữa (nhanh) được sử dụng trong lệnh đầu tiên: STORE_FAST
và LOAD_FAST
. Chúng giúp lưu trữ nhanh và lấy giá trị trong fastlocals
mảng của khung thực thi hiện tại. Sau đó, trong cả hai trường hợp, a RETURN_VALUE
được thực hiện. Vì vậy, thứ hai nhanh hơn một chút do ít lệnh cần thực thi hơn.
Nói chung, hãy lưu ý rằng trình biên dịch CPython thận trọng trong việc tối ưu hóa nó thực hiện. Nó không và không cố gắng trở nên thông minh như các trình biên dịch khác (nói chung, cũng có nhiều thông tin hơn để làm việc). Mục tiêu thiết kế chính, ngoài việc rõ ràng là chính xác, là a) giữ cho nó đơn giản và b) càng nhanh càng tốt trong việc biên dịch chúng để bạn thậm chí không nhận thấy rằng một giai đoạn biên dịch đang tồn tại.
Cuối cùng, bạn không nên tự rắc rối với những vấn đề nhỏ như thế này. Lợi ích về tốc độ là rất nhỏ, không đổi và bị hạn chế bởi chi phí được giới thiệu bởi thực tế là Python được thông dịch.
* dis
là một mô-đun Python nhỏ giúp giải mã của bạn, bạn có thể sử dụng nó để xem mã bytecode Python mà máy ảo sẽ thực thi.
Lưu ý: Như cũng đã nêu trong nhận xét của @Jorn Vernee, điều này dành riêng cho việc triển khai CPython của Python. Các triển khai khác có thể thực hiện tối ưu hóa tích cực hơn nếu họ muốn, CPython thì không.
dis.dis(..)
trên cả hai, bạn thấy rằng có sự khác biệt , vì vậy có. Nhưng trong hầu hết các ứng dụng thế giới thực , chi phí này so với độ trễ của quá trình xử lý trong chức năng không nhiều lắm.