Series PyPy - Phần 1: Giới thiệu về PyPy

1220
20-09-2021
Series PyPy - Phần 1: Giới thiệu về PyPy

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),...

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:

Series PyPy - P1: Giới thiệu về PyPy - Ảnh 1.

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

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.

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 timeit
ONE_MILLION = 10 ** 6
t_empty = timeit.Timer(
"for i in range({}):\n pass\n".format(ONE_MILLION)
)
t = timeit.Timer(
"s = 0\nfor i in range({}):\n s = s + i\nprint(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)

Đ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.

Series PyPy - P1: Giới thiệu về PyPy - Ảnh 3.

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".

If you want your code to run faster, you should probably just use PyPy

Guido van Rossum

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:

TAGS: Python
SHARE