"PyPy là một reimplementation của Python trong Python" là một cách khá gây hiểu lầm để mô tả PyPy, IMHO, mặc dù đó là sự thật về mặt kỹ thuật.
Có hai phần chính của PyPy.
- Khung dịch
- Các thông dịch viên
Khung dịch là một trình biên dịch. Nó biên dịch RPython mã xuống C (hoặc các mục tiêu khác), tự động thêm vào các khía cạnh như thu thập rác và trình biên dịch JIT. Nó không thể xử lý mã Python tùy ý, chỉ RPython.
RPython là tập con của Python bình thường; tất cả các mã RPython là mã Python, nhưng không phải là cách khác xung quanh. Không có định nghĩa chính thức về RPython, bởi vì RPython về cơ bản chỉ là "tập hợp con của Python có thể được dịch bởi khuôn khổ dịch thuật của PyPy". Nhưng để được dịch, mã RPython phải là được nhập tĩnh (các loại được phỏng đoán, bạn không khai báo chúng, nhưng nó vẫn đúng một loại cho mỗi biến), và bạn không thể làm những việc như khai báo/sửa đổi các hàm/lớp trong thời gian chạy.
Thông dịch viên sau đó là trình thông dịch Python bình thường được viết bằng RPython.
Vì mã RPython là mã Python bình thường, bạn có thể chạy nó trên bất kỳ trình thông dịch Python nào. Nhưng không có tuyên bố tốc độ của PyPy đến từ chạy nó theo cách đó; đây chỉ là một chu kỳ kiểm tra nhanh, bởi vì dịch thông dịch viên mất thời gian dài.
Với điều đó được hiểu, cần rõ ràng rằng các suy đoán về PyPyPy hoặc PyPyPyPy không thực sự có ý nghĩa gì. Bạn có một thông dịch viên được viết bằng RPython. Bạn dịch nó sang mã C thực hiện nhanh Python. Có quá trình dừng lại; không có thêm RPython để tăng tốc bằng cách xử lý nó một lần nữa.
Vì vậy, "Làm thế nào để PyPy có thể nhanh hơn CPython" cũng trở nên khá rõ ràng. PyPy có một triển khai tốt hơn, bao gồm một trình biên dịch JIT (nó thường không hoàn toàn nhanh nếu không có trình biên dịch JIT, tôi tin rằng, điều này có nghĩa là PyPy chỉ nhanh hơn cho các chương trình dễ bị biên dịch JIT). CPython không bao giờ được thiết kế để thực hiện tối ưu hóa cao của ngôn ngữ Python (mặc dù chúng cố gắng làm cho nó được thực hiện tối ưu được tối ưu hóa, nếu bạn làm theo sự khác biệt).
Bit thực sự sáng tạo của dự án PyPy là chúng không viết lược đồ GC tinh vi hoặc trình biên dịch JIT bằng tay. Họ viết trình thông dịch tương đối đơn giản trong RPython, và đối với tất cả RPython là cấp thấp hơn Python, nó vẫn là ngôn ngữ thu gom hướng đối tượng, cao hơn nhiều so với C. Sau đó khung dịch tự động thêm những thứ như GC và JIT. Vì vậy, khung dịch là nỗ lực lớn, nhưng nó áp dụng tốt cho trình thông dịch python Python nhưng họ thay đổi việc triển khai, cho phép tự do hơn trong thử nghiệm để cải thiện hiệu suất (không lo lắng về việc giới thiệu lỗi GC hoặc cập nhật trình biên dịch JIT) đối phó với những thay đổi). Nó cũng có nghĩa là khi họ có được xung quanh để thực hiện một trình thông dịch Python3, nó sẽ tự động nhận được những lợi ích tương tự. Và bất kỳ người phiên dịch nào khác được viết bằng khuôn khổ PyPy (trong đó có một số ở các giai đoạn đánh bóng khác nhau). Và tất cả các thông dịch viên sử dụng khung công tác PyPy sẽ tự động hỗ trợ tất cả các nền tảng được khung công tác hỗ trợ. Vì vậy, lợi ích thực sự của dự án PyPy là tách biệt (càng nhiều càng tốt) tất cả các phần của việc thực hiện một trình thông dịch độc lập nền tảng hiệu quả cho một ngôn ngữ động. Và sau đó đến với một thực hiện tốt của họ ở một nơi, có thể được tái sử dụng trên nhiều thông dịch viên. Đó không phải là một chiến thắng ngay lập tức như "chương trình Python của tôi chạy nhanh hơn bây giờ", nhưng đó là một viễn cảnh tuyệt vời cho tương lai.
Và nó có thể chạy chương trình Python của bạn nhanh hơn (có thể).
Nitpick: PyPy * là * PyPyPy. Hãy nghĩ về tiền tố Py- * làm toán tử chiếu. – u0b34a0f6ae
Ok. vì vậy PyPy nên được ưa thích hơn để CPython? nó có bất kỳ hạn chế nào không? – balki
PyPy là tuyệt vời khi tối ưu hóa thời gian chạy, nhưng các phần tử khác nhau của nó làm cho nó [không tương thích] (https://bitbucket.org/pypy/compatibility/wiki/Home) với một số phần mở rộng C phổ biến. –