Hackspeed với Cython

Tram Ho

Python là một trong những ngôn ngữ lập trình phổ biến và được yêu thích nhất hiện nay. Tuy nhiên, khi làm việc với Python, bạn sẽ gặp hoặc được nghe kể về một trong những điểm yếu tới thời điểm này: Python is slow.

Có một vài cách để speed up đoạn code Python của bạn. Có thể bạn đã đọc ở đâu đó:

  • Using multi-processing libraries
  • Using asynchronous

Bạn có thể đọc thêm bài viết của mình tại đây.

Như ở trên, bạn sẽ tiếp cận 2 mặt để speed up Python code: parallel programmingasynchronous programming. Bây giờ, mình sẽ giới thiệu một mặt tiếp cận khác. Đó là Cython.

What’s Cython ?

Có thể hiểu Cython là một bước trung gian giữa Python và C/C++. Nó cho phép bạn viết Python pure với một số sửa đổi nhỏ, sau đó được dịch trực tiếp sang C.

Cython sẽ mang cho bạn sức mạnh kết hợp của Python và C:

  • Python code gọi qua lại C hoặc C ++ code native bất kỳ lúc nào.

  • Dễ dàng điều chỉnh Python code để có hiệu suất như C code đơn giản bằng cách thêm khai báo kiểu tĩnh, cũng theo cú pháp Python.

  • Tương tác hiệu quả với các big data set.

  • Integrate native với code có sẵn, low-level hoặc high-performance libs/apps.

Một số thông tin khác:

Bạn có thể dễ dàng cái Cython qua pip

So với Python code, bạn cần phải thêm type information to every variable. Thông thường, để khai báo một biến Python, rất đơn giản:

Với Cython, bạn cần add thêm type cho biến đó:

Cũng giống trong C, khai báo type cho variable trong Cython là bắt buộc.

Types in Cython

Khi sử dụng Cython, có hai điểm khác nhau cho variable và function.

For variable:

Tất cả các type này bắt nguồn từ C/C++.

For function:

Với:

  • def: Function python pure, chỉ gọi từ Python.
  • cdef: Cython only functions. Chỉ được gọi từ Cython.
  • cpdef: C and Python function. Có thể được gọi từ C và Python.

How to speedup your code with Cython

Đầu tiên, mình sẽ tạo một đoạn code Python pure với for-loop.

Áp dụng những gì đã đã hiểu ở trên, mình sẽ viết đoạn code bằng Cython cùng với một ý nghĩa:

Khi code Cython, make sure rằng toàn bộ các variable của bạn phải được set type.

Tiếp theo, ta cần tạo một file để compile từ Cython -> C code:

Sau khi đặt run_test_cython.pyxsetup.py cùng dir, ta bắt đầu thực hiện compile:

Kế quả:

Bạn sẽ thấy được trong folder này đã chứa toàn bộ files cần cho việc run C code. Nếu bạn tò mò đoạn code Cython kia sẽ compile ra đoạn code C là gì bạn có thể cat để xem file đó:

Nào, đã đến lúc thể hiện sức mạnh của C code. Đoạn code sau để so sánh tốc độ của Python pure và Cython:

Kết quả sau khi chạy speedtest.py

Với cấu hình máy hiện tại để test của mình:

  • CPU: Intel® Core™ i5-4460 CPU @ 3.20GHz × 4
  • Ram: 8G

Fill kết quả vào table cho dễ nhìn:

NumberPython timeCython timeSpeedup
103.5762786865234375e-067.152557373046875e-075.0
1007.867813110351562e-062.384185791015625e-0733.0
10000.00028109550476074229.5367431640625e-07294.75
100000.021443367004394537.62939453125e-062810.625
1000003.11714386940002448.630752563476562e-0536116.70994475138

36116 – Có vẻ là một con số không tưởng 😄.

Rõ ràng, Cython mang đến cho bạn performance rất tốt. Đây cũng là một giải pháp khả thi nếu bạn muốn cải tiến code của bạn.

Source: https://cython.org/

Thanks for reading!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo