Tại sao Python không được tối ưu hóa như triển khai Javascript hiện đại?


11

Các triển khai Javascript hiện đại như V8 (Chrome), SpiderMonkey (Firefox) và Chakra (IE / Edge) đều có trình biên dịch JIT và một số tối ưu hóa khác để cải thiện hiệu suất.

Tại sao Python không có những thứ này?

Tôi đã xem xét PyPy và IronPython, cả hai đều khẳng định tốc độ tăng. PyPy Tôi không hiểu cách triển khai Python được viết bằng Python, ngôn ngữ được dịch, sẽ nhanh hơn so với triển khai tham chiếu trong C. IronPython, cùng một ý tưởng nhưng tôi không thấy .NET Framework sẽ tăng tốc độ như thế nào.


2
IronPython - giống như bất kỳ ngôn ngữ .NET nào khác - được biên dịch thành "Ngôn ngữ trung gian chung" của Microsoft, nơi tồn tại các triển khai trình biên dịch JIT rất thành thục.
Doc Brown

2
Ngôn ngữ lập trình là một đặc tả (được viết trong một số tài liệu), không phải là một phần mềm. Chỉ triển khai ngôn ngữ lập trình là phần mềm (và có thể là trình biên dịch hoặc thông dịch viên).
Basile Starynkevitch

1
@BasileStarynkevitch: Tôi không hiểu những gì bạn đang cố nói với chúng tôi bằng nhận xét này. OP đang hỏi rõ ràng về CPython, PyPy và IronPython, đó các triển khai Python cụ thể.
Doc Brown

1
@DocBrown Có vẻ như là một điểm có liên quan để đưa ra, đưa ra đoạn cuối cùng trong câu hỏi, điều này cho thấy sự hiểu lầm khi nó đặc biệt gọi Python là ngôn ngữ diễn giải.
8bittree

Câu trả lời:


19

Tại sao Python không có những thứ này?

Tôi không chắc tại sao bạn nghĩ rằng không có triển khai Python nào quan tâm đến hiệu suất. PyPy , IronPythonJython đều là các triển khai Python sẵn sàng sản xuất, quan tâm đến hiệu suất. Pyston là một thực hiện trong phát triển đã được đặc biệt tạo ra để thực hiện. Unladen SwallowPsyco cũng là những dự án cải thiện hiệu năng của Python.

Tuy nhiên, thực tế là người dùng CPython vượt xa tổng số cơ sở người dùng kết hợp của tất cả các triển khai khác, rằng Unladen Swallow đã bị cộng đồng từ chối, rằng hầu hết các dự án này đều đã chết hoặc đang vật lộn để thu hút các nhà phát triển sẽ cho bạn biết điều gì đó về Python. hiệu suất cộng đồng.

Câu trả lời này là một ví dụ điển hình về tâm lý điển hình của cộng đồng Python: thay vì khắc phục các vấn đề về hiệu năng, họ chỉ đơn giản thích viết mã của họ không bằng Python.

Tôi đã xem xét PyPy và IronPython, cả hai đều khẳng định tốc độ tăng. PyPy Tôi không hiểu cách triển khai Python được viết bằng Python, ngôn ngữ được dịch, sẽ nhanh hơn so với triển khai tham chiếu trong C.

Trước hết: không quan trọng trình biên dịch được viết bằng ngôn ngữ nào. Rốt cuộc, trình biên dịch chỉ được thực thi một lần , vì vậy ngay cả khi nó chậm, điều đó không quan trọng: hiệu suất của trình biên dịch là không liên quan, điều gì có liên quan là hiệu suất của đầu ra của trình biên dịch.

Thứ hai, vì nó chỉ quan trọng đầu ra của trình biên dịch nhanh như thế nào và trình biên dịch được viết bằng Python, tức là ngôn ngữ mà nó biên dịch, nó thực sự có thể tự làm nhanh bằng cách tự biên dịch.

Thứ ba, không có thứ gọi là "ngôn ngữ diễn giải". Một ngôn ngữ là một tập hợp các quy tắc và hạn chế toán học. Đây là một đặc điểm kỹ thuật. Một mẩu giấy. Một ngôn ngữ không được biên dịch hoặc giải thích. Một ngôn ngữ chỉ . Biên dịch và giải thích là những đặc điểm của việc thực hiện ngôn ngữ , chính xác hơn là trình biên dịch hoặc trình thông dịch (duh!), Chứ không phải ngôn ngữ. Mỗi ngôn ngữ có thể được thực hiện bởi một trình biên dịch. Mỗi ngôn ngữ có thể được thực hiện bởi một thông dịch viên. Bạn có thể tạo một trình biên dịch từ trình thông dịch và trình thông dịch từ trình biên dịch.

Nhưng tất cả những điều này thực sự không quan trọng, bởi vì PyPy thực sự không được viết bằng Python. Nó được viết bằng RPython . RPython bao gồm hai phần, ngôn ngữ lập trình RPython và khung RPython.

Ngôn ngữ lập trình RPython không phải là Python. Nó là một ngôn ngữ lập trình khác nhau. RPython là ngôn ngữ lập trình được gõ tĩnh, gần bằng mức độ trừu tượng như Java, với hiệu năng gần như C. RPython là một tập hợp con cú pháp và ngữ nghĩa của Python, có nghĩa là mọi chương trình RPython đều là chương trình Python hợp lệ và có thể được điều hành bởi một triển khai Python (mặc dù thường có một số đơn hàng độ lớn chậm hơn, nhưng điều này vẫn hữu ích để gỡ lỗi vì bạn có quyền truy cập vào tất cả các công cụ của Python và việc giải thích bắt đầu ngay lập tức, trong khi quá trình biên dịch ngôn ngữ thường mất khoảng 5-10 phút ), nhưng điều ngược lại là không đúng sự thật.

Khung RPython là một khung để viết các triển khai ngôn ngữ động hiệu suất cao bằng ngôn ngữ lập trình RPython. Nó bao gồm một trình thu gom rác, không gian đối tượng, giao thức đối tượng meta, các đối tượng được xác định trước, các loại và các hoạt động, v.v. Nhưng viên ngọc quý là khả năng tự động tạo trình biên dịch JIT từ trình thông dịch: nếu bạn triển khai một ngôn ngữ trong khung RPython, bạn chỉ phải viết một trình thông dịch, khung RPython sẽ xử lý JIT.

Có rất nhiều triển khai ngôn ngữ trên nền tảng RPython , không chỉ PyPy.

IronPython, cùng một ý tưởng nhưng tôi không thấy .NET Framework sẽ tăng tốc độ như thế nào.

Hầu hết các triển khai của ISO CLI, chẳng hạn như các biến thể .NET khác nhau của Microsoft hoặc Mono, đều chứa các trình thu gom rác, tối ưu hóa và trình biên dịch phức tạp. Điều này cũng đúng với các triển khai Jython và Java.

IronPython là một trình biên dịch, nó biên dịch mã nguồn Python thành các cây DLR (DLR là Dynamic Language Runtime), sau đó được biên dịch thành mã byte CIL, sau đó lại được biên dịch lại thành mã máy gốc.


6

Các triển khai Javascript hiện đại như V8 (Chrome), SpiderMonkey (Firefox) và Chakra (IE / Edge) đều có trình biên dịch JIT và một số tối ưu hóa khác để cải thiện hiệu suất.

Tại sao Python không có những thứ này?

JavaScript được bao gồm trong các trình duyệt web và số lượng phần mềm đáng kể ngày nay được thiết kế để chạy trong các trình duyệt web. Điều này làm cho hiệu suất JavaScript rất quan trọng khiến các công ty như Google, Apple và Microsoft đầu tư rất nhiều tài nguyên để làm cho thời gian chạy JavaScript nhanh chóng. Nếu dòng tiền này được chuyển hướng đến Python, nó sẽ nhanh không kém.

PyPy Tôi không hiểu cách triển khai Python được viết bằng Python, ngôn ngữ được dịch, sẽ nhanh hơn so với triển khai tham chiếu trong C.

Ý tưởng là một khi mã là JIT-ed, nó không còn được "diễn giải" nữa. PyPI hoạt động bằng cách chuyển đổi mã Python thành mã máy (ví dụ mã máy x86_64) sau đó được thực thi trực tiếp trên bộ xử lý.


3
Đặc biệt có liên quan là, trong trình duyệt web, không có thay thế nào cho JavaScript (hoặc ít nhất, thường không có gì có sẵn trên tất cả các trình duyệt chính). Nếu bạn muốn hiệu suất nhanh trong trình duyệt web, thì bạn phải triển khai JavaScript nhanh. Trong khi đó trên các nền tảng chạy Python, bạn gần như chắc chắn có thể chuyển sang một ngôn ngữ khác có thể thực hiện tốt hơn.
8bittree

-3

Nếu bạn cấu trúc mã python của mình thành các mô-đun với khởi động cấp cao đơn giản là tệp python chính, (có rất ít mã trong đó), thì python sẽ biên dịch tất cả phần còn lại của mã thành mã byte độc ​​lập của máy, đây là tập tin .pyc mà bạn thấy trong cấu trúc thư mục của bạn. Điều này giảm thiểu thời gian tải và giải thích sau lần chạy đầu tiên.

Nếu bạn khởi động tập lệnh của mình bằng các cờ -O hoặc -OO hoặc đặt PYTHONOPTIMIZE thành giá trị lớn hơn 0 thì các tệp .pyo được tạo sẽ được tối ưu hóa hơn nữa.

Nếu bạn cần tối ưu hóa cao cho một số chức năng cụ thể, bạn có thể viết chúng bằng C, C ++, FORTRAN hoặc GO và sau đó sử dụng chúng từ bên trong python.


Làm thế nào để bạn tích hợp các phần mở rộng không C vào Python? Tôi chỉ biết về phần mở rộng C cho Cython.

1
@Bey: Về cơ bản, mọi thứ trong thư viện dùng chung, (hay hoặc .so), có thể được gọi từ python miễn là bạn biết các chữ ký hàm - chúng có thể được cấu hình thủ công, được tạo bởi các công cụ như swing hoặc thậm chí được tạo từ tài liệu doxygen. stackoverflow.com/questions/5811949/ cho là hữu ích như blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.