Hướng dẫn dùng numba 5 python
Từ lâu, giới lập trình viên đều mặc định là Python tính toán chậm hơn C++. Thế nên, nếu ai đó bảo Python có thể tính toán nhanh như C++ thì chắc họ phải làm gì đó để "lên đời" những dòng code code Python. Trong bài viết này, tôi sẽ giới thiệu với các bạn một công cụ có tên Numba, là một trong những thứ có thể giúp cho Python trở thành một thế lực đáng gờm về mặt tốc độ thực thi so với C++. Show Bài viết này sẽ gồm các phần: So sánh tốc độ thực thi giữa C++ và Python, Giải thích lý do tại sao lại có sự chênh lệch này và "lên thần" cho code Python. Tốc độ thực thi của Python vs C++Để so sánh tốc độ thực thi của Python và C++, chúng ta sẽ cùng nhau sử dụng Python và C++ để giải quyết bài toán tìm số nguyên tố bằng thuật toán cơ bản (bỏ qua việc tối ưu thuật toán): Ta sẽ thực hiện kiểm tra số nguyên tố cho danh sách các số từ 1 đến number = 10000000 (mười triệu) để có thể tăng thời gian thực thi của chương trình.
Nếu viết bằng C++, ta sẽ có đoạn code như sau (lưu lại thành file is_prime.cpp):
Kết quả chạy:
Như này là trên máy của tôi C++ đang nhanh như Python khoảng ~15 lần. Tại sao C++ lại nhanh hơn PythonC++ là ngôn ngữ lập trình với các mã nguồn được thực thi theo cách biên dịch, đó là việc trình biên dịch sẽ thực hiện "dịch" trực tiếp source code sang mã máy sau đó thực hiện thực thi mà không cần qua một bước trung gian nào. Python thì khác, chúng ta thường sử dụng Cython để thực hiện thông dịch source code Python sang thành định dạng .pyc file (chúng ta hay gọi là pycache) sau đó mới thực hiện biên dịch pyc file sang mã máy. Do qua các bước trung gian nên việc thực thi Python source code mới bị chậm hơn rất nhiều so với C++. Ngoài lý do trên, thì Python sử dụng kiểu dữ liệu động (dynamic type) còn C++ dùng static type. Với Python: Với C++, trình biên dịch đã biết ngay kiểu dữ liệu của MAX_NUMBER là integer và sẽ thực hiện cấp phát bộ nhớ được ngay lập tức. Sử dụng numba để tăng tốc độ tính toán cho Python.Numba là một trình dịch JIT mã nguồn mở dùng dùng cho Python và đặc biệt là numpy. Numba sẽ thực hiện "dịch" source code python sang trực tiếp mã máy để tăng tốc độ thực thi. Các bạn có thể tham khảo thêm về numba tại link: https://numba.pydata.org/ Cài đặt numba: Sau đây là thay đổi nhỏ trong file is_prime.py để đẩy nhanh tốc độ thực thi của source code và lưu lại thành file is_prime_numba.py:
Thời gian thực thi đã giảm xuống đáng kể:
Nếu như bình thường, chắc chắn tôi đã reo lên khi tốc độ thực thi giảm xuống sát chỉ kém C++ khoảng 10% và vui vẻ mang đi khoe. Tuy nhiên sau khi tìm hiểu tiếp thì Numba còn cung cấp cho các lập trình viên Python một trình biên dịch có tốc độ còn nhiều hơn con số -10% ở trên. Numba cung cấp khả năng cho phép tính toán song song với các tác vụ có sự lặp lại bằng tham số parallel=True.
Thời gian thực thi của function đã thay đổi đến mức...kinh ngạc:
So với con số 2.x seconds của C++ thì kết quả trên mang lại niềm hứng khởi cho các lập trình viên Python. (Tất nhiên là do phía C++ đang chưa dùng đến parallel computing). Ngoài các chức năng trên, chúng ta cũng có thể tìm được các function, các cách ứng dụng khác của numba từ tài liệu: https://numba.pydata.org/numba-doc/latest/user/5minguide.html Kết.Một bài ví dụ vui vui, mang lại sự tự tin cho các lập trình Python khi thực hiện xử lý các bài toán với mức độ tính toán nhiều và phức tạp. Bài viết hoàn
toàn không có tính chất so sánh hay hạ thấp tính năng tính toán phức tạp của ngôn ngữ C++. Cảm ơn các bạn đã đọc bài viết của tôi. |