Series này là một chuỗi các bài viết xung quanh PyPy. Ngoài việc chỉ giới thiệu về PyPy, chuỗi bài viết này còn đào sâu vào các khía cạnh kỹ thuật và best practices, tips thực tế khi sử dụng PyPy.
Giới thiệu về PyPy
Như các ngôn ngữ C++, Javascript, PHP,… Python cũng có khá nhiều các phiên bản (implementation) khác nhau nhằm phục vụ nhiều mục đích như: CPython (phiên bản mặc định và phổ biến nhất), JPython (phiên bản bản viết trên ngôn ngữ Java), PyPy (phiên bản viết trên chính ngôn ngữ Python),…
Bạn đang xem: Pypy là gì
Các bản implementation của Python thường nhắm đến mục tiêu sử dụng thế mạnh, đặc điểm của một ngôn ngữ X nào đó trong Python. Ví dụ như IronPython sẽ hỗ trợ người dùng sử dụng các .NET libraries, các ngôn ngữ .NET bằng Python hay như JPython là phiên bản Python viết bằng Java để lập trình viên sử dụng được cả 2 ngôn ngữ này trong quá trình phát triển.
Phiên bản CPython là phiên bản Python được viết trên ngôn ngữ C và là phiên bản chính thức và được sử dụng rộng rãi trên thế giới (bản mà bạn tải về trên trang https://www.python.org). CPython có một điểm yếu cố hữu là hiệu năng chậm, trang https://benchmarksgame-team.pages.debian.net/benchmarksgame/ thực hiện giải các bài toán/thuật toán cần xử lý, tính toán nhiều và đưa kết quả benchmark giữa các ngôn ngữ như Swift, JS(Node.js), Dart, PHP, Python,… Kết quả như sau:
benchmarksgame-team.pages.debian.net
Chúng ta có thể thấy trong bảng so sánh, Python (mà ở đây là CPython) chỉ nhanh hơn 2 ngôn ngữ phổ biến đó là Perl và Ruby, trong khi các ngôn ngữ nhanh nhất là C, C++, Rust.
Để khắc phục vấn đề hiệu năng trên CPython, PyPy đã được phát triển nhằm phục vụ cho các công việc yêu cầu hiệu năng cao nhưng vẫn cần syntax đẹp, dễ hiểu như Python.Trên trang chủ của mình, PyPy ghi rằng “hiệu năng trung bình của PyPy gấp 4.2 lần hiệu năng của CPython“. Do đó nếu muốn tìm một giải pháp tăng tốc Python code của mình với 4.2 lần “với một câu lệnh”, PyPy có thể sẽ là một phương án tốt. Ở phần sau của bài viết chúng tôi sẽ có một bài đánh giá hiệu năng cơ bản giữa 2 bản Python này.
pypy.org
Vậy PyPy là gì?
Theo định nghĩa trên trang chủ, PyPy gọi mình là “a fast, compliant alternative implementation of Python“. Nghĩa là một phiên bản nhanh, “dễ chiều” của Python. Từ “compliant” (dễ chiều) ở đây để nói đến tính tương tích của PyPy với CPython.Còn từ “nhanh” để nói đến hiệu năng của PyPy, điểm quan trọng nhất và cũng là lý do lớn nhất để sử dụng PyPy.
Xem thêm: Ý nghĩa của chỉ số xét nghiệm PLT trong đếm số lượng tiểu cầu
Về mặt kỹ thuật, PyPy được viết trên RPython (Restricted Python) – một nhánh nhỏ của Python. RPython có syntax (cú pháp) giống với Python và được sửa đổi để đạt hiệu năng cao hơn. Do đó PyPy được biết đến là một phiên bản Python được viết trên Python.
Cài đặt PyPy
Bạn có thể lên trang Download của PyPy, tải về phiên bản tương ứng với hệ điều hành của mình. Sau khi tải xong, bạn chỉ cần giải nén và có thể chạy luôn file binary.
Ví dụ ở đây, chúng tôi dùng zsh trên MacOS:
tar xf pypy3.7-v7.3.5.tar.bz2 cd pypy3.7-v7.3.5-osx64/bin ./pypy3 Python 3.7.10 (77787b8f4c49, May 19 2021, 05:28:43) [PyPy 7.3.5 with GCC Apple LLVM 12.0.5 (clang-1205.0.22.9)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. >>>> lst = [] >>>> lst.append(1) >>>> lst [1]
Ngoài ra, nếu bạn sử dụng MacOS có thể sử dụng brew để cài đặt với một câu lệnh:
brew install pypy3
Tìm hiểu thêm về cài đặt PyPy tại đây: https://doc.pypy.org/en/latest/install.html
Các ưu điểm của PyPy so với CPython
Ưu điểm:
- Hiệu năng cao nhờ Just-in-Time (JIT) complier. Đây là ưu điểm lớn nhất và là lý do lớn nhất để dùng PyPy.
- Có thể viết code concurrency số lượng lớn nhờ vào tính năng Stackless.
- Tối ưu bộ nhớ hơn so với CPython do cải tiến trong cơ chế Garbage Collector.
Nhược điểm:
- Tương tích kém với các C extensions.
- Hiệu năng thực sự khác biệt với CPython trong trường hợp các chương trình lớn, chạy trong thời gian dài (vì đặc tính của JIT compiler).
- Các tính năng mới đi sau so với CPython. Tại thời điểm viết bài này, bản PyPy mới nhất là 3.7 trong khi CPython đã là 3.9 sắp lên 3.10. Điều này là dễ hiểu vì PyPy là một phiên bản implement lại của Python trong khi CPython là bản chính thức, do đó nếu bạn muốn sử dụng PyPy thì bạn chỉ nên sử dụng cú pháp Python bản 3.6, 3.7.
Các ưu nhược điểm này sẽ được phân tích kỹ vào các phần sau.
Benchmark hiệu năng với CPython
Mình sẽ sử dụng đoạn code này để đo hiệu năng giữa CPython và PyPy:
import timeitONE_MILLION = 10 ** 6 t_empty = timeit.Timer( “for i in range({}):n passn”.format(ONE_MILLION) ) t = timeit.Timer( “s = 0nfor i in range({}):n s = s + inprint(s)”.format(ONE_MILLION) ) took_empty = t_empty.repeat(10, 1) empty_best = min(took_empty) took = t.repeat(10, 1) best = min(took) empty_iterate_freq = ONE_MILLION // empty_best plus_iterate_freq = ONE_MILLION // best print(empty_iterate_freq, plus_iterate_freq)
Nội dung liên quan: Chuẩn IP67 là gì? Tìm hiểu về chuẩn IP67
Đoạn code này được thực hiện trên MacBook Pro 2013 2017 (CPU: 7th Generation Core i5, 7267U, 3.1GHz). Kết quả:
– PyPy 3.7: 1542474318.0 661969327.0
PyPy 3.7 có thể lặp 1542474318 (hơn 1 tỷ rưỡi) vòng và thực hiện 661969327 (hơn 666 triệu) phép tính vòng 1 giây.
– CPython 3.7: 43455074.0 16236501.0
CPython 3.7 có thể lặp 43455074 (43 triệu) vòng và thực hiện 16236501 (16 triệu) phép tính trong vòng 1 giây.
Qua đoạn code test thử hiệu năng trên, ta có thể thấy hiệu năng của PyPy xấp xỉ gấp 40 lần so với CPython.Vì sao đoạn code chỉ có 2 đến 3 dòng mà hiệu năng lại vượt trội hơn hẳn trong khi ở trên mình đã đề cập rằng “hiệu năng của PyPy chỉ thực sự khác biệt với chương trình lớn và chạy trong thời gian dài“? Các bạn vui lòng đón xem các phần sau để hiểu rõ hơn nhé.
Kết luận
Như Guido van Rossum đã nói ở PyCon US 2015: “Nếu bạn muốn code (Python) chạy nhanh hơn, bạn có thể chỉ cần sử dụng PyPy“.
PyPy là phiên bản Python nhanh nhất và có thể khả năng thay thế được CPython trong một số trường hợp. Chỉ cần chạy chương trình code với PyPy thay vì CPython, hiệu năng chương trình của bạn có thể cải thiện đáng kể mà cần chỉnh sửa gì thêm. Nhưng phiên bản này cũng có một số nhược điểm liên quan đến vấn đề tương tích và kỹ thuật.
Trong Phần 1 của series, chúng tôi đã giới thiệu về PyPy, một phiên bản hiệu năng cao của Python. Ở các phần sau, chúng ta sẽ phân tích sâu hơn về các yếu tố kỹ thuật và đưa ra một số tips để tăng tốc một ứng dụng Python thực tế.
Nguồn tham khảo:
Đang hot: So sánh HDR10, HDR10 và Dolby Vision: Có gì khác biệt?
- https://pp.pymi.vn/article/slow/
- https://realpython.com/pypy-faster-python/
- https://www.pypy.org/