Hướng dẫn python call c code Hướng dẫn FULL

Hướng dẫn python call c code Hướng dẫn FULL

Thủ Thuật về Hướng dẫn python call c code 2022


Bạn đang tìm kiếm từ khóa Hướng dẫn python call c code được Update vào lúc : 2022-10-01 22:20:28 . Với phương châm chia sẻ Mẹo về trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Admin lý giải và hướng dẫn lại nha.


Nếu đã từng dùng qua những thư viện liên quan đến toán học của Python như numpy, những bạn sẽ để ý thấy những nó có vận tốc xử lý rất nhanh. Điều này là vì một phần của package này được viết bằng C/C++ và phần code Python gọi những phần đó để chạy nên vận tốc chạy khi xử lý của numpy khá là nhanh.


Nội dung chính


  • Lợi ích của việc dùng hàm C++ trong Python

  • 1. Chuẩn bị shared library

  • 2. Dùng shared library trong Python với ctypes

Hướng dẫn python call c code


Vậy làm thế nào để hoàn toàn có thể gọi được mã C++ từ trong Python? Trong Python, có quá nhiều thư viện hoàn toàn có thể giúp bạn đạt được điều này. Bài viết sau này sẽ hướng dẫn bạn dùng thư viện ctypes của Python để hoàn toàn có thể call function được code bằng C++.


Lợi ích của việc dùng hàm C++ trong Python


Trước hết, đấy là những quyền lợi của việc call function được viết bằng C++ trong Python:


  • Tận dụng code C++ đã có sẵn: Nếu bạn đã có sẵn một hàm/thư viện được viết bằng C++ và được test kỹ lưỡng, bạn hoàn toàn có thể tận dụng chúng được luôn thay vì phải viết toàn bộ sang Python. Nó sẽ hỗ trợ bạn tiết kiệm chi phí được đáng kể thời hạn để code.

  • Tăng vận tốc xử lý: Python là ngôn từ thông dịch, còn C++ là ngôn từ biên dịch, do đó, C++ sẽ có được vận tốc nhanh hơn

    thật nhiều so với Python. Ngoài ra, GIL (Global Interpreter Lock) của Python chỉ được cho phép chạy duy nhất một thread tại thuở nào điểm nên việc dùng thread sẽ không còn thể tận dụng được những core của CPU. Việc dùng C++ còn tương hỗ vô hiệu được hạn chế này.

1. Chuẩn bị shared library


Để dùng được code C++ trong Python, bạn sẽ nên phải compile nó ra dưới dạng shared library. Trong Windows, đây sẽ là một file có đuôi .dll, còn với Linux, nó sẽ có được đuôi .so. Trong

nội dung bài viết này, mình sẽ dùng Windows và compiler MSVC để làm ví dụ.


Trong ví dụ này, mình sẽ xuất một function in ra dãy số Fibonacci đến số thứ n. Code mẫu này mình sẽ save với đường dẫn srctest.cpp:


#include <iostream>

#include <vector>


extern “C”

__declspec(dllexport) int test_func(int n)

std::vector<int> f;

int i;


f.push_back(0); // f[0] = 0

f.push_back(1); // f[1] = 1


for (i = 2; i <= n; i++)

f.push_back(f[i – 1] + f[i – 2]);


std::cout << “Fibonacci up until ” << n << “-th digit: “;

for (i = 1; i <= n; i++)

std::cout << f[i] << ” “;


return f[n];


Trong đoạn code trên, block lệnh extern “C” đơn thuần và giản dị được sử dụng để tắt cơ chế name mangling của C++ cho những hàm được định nghĩa ở trong. Cụ thể, C++ có tương hỗ function overloading, nghĩa là ta hoàn toàn có thể có nhiều function cùng một tên mà chỉ việc khác kiểu và số lượng tham số được định

nghĩa. Tuy nhiên, ngôn từ lập trình C lại không tương hỗ cơ chế này nên nên phải sử dụng nó để code C++ hoàn toàn có thể tương thích được với C. Khi compile đoạn code dưới đây, compile sẽ báo lỗi error C2733: ‘test_func’: you cannot overload a function with ‘extern “C”‘ linkage.


extern “C”

int test_func(double a)


int test_func(int n)


Còn đoạn __declspec(dllexport) đơn thuần và giản dị được sử dụng để báo cho compiler biết rằng nó cần export function (với ví dụ trên là function test_func) ra một file DLL.


Sau khi đã có được hàm C++, ta cần compile code ra một file obj. Với MSVC, cú pháp để compile là:


cl /EHsc /c srctest.cpp /Fo”obj\fibo.obj”


Sau khi compiler biên dịch ra

file objfibo.obj, ta cần link nó ra file DLL với lệnh sau:


link /DLL /OUT:fibo.dll objfibo.obj


Kết quả, ta sẽ tiến hành một fibo.dll có hàm test_func để dùng ở ngoài.


2. Dùng shared library trong Python với ctypes


Python phục vụ sẵn cho ta thư viện ctypes được cho phép toàn bộ chúng ta tạo những kiểu tài liệu tương thích với C và gọi những hàm từ shared library. Chi tiết về những kiểu tài liệu ctypes được cho phép tạo hoàn toàn có thể xem tại

đây.


Đầu tiên, ta cần import ctypes để hoàn toàn có thể dùng nó. Sau đó, ta sẽ dùng CDLL để load file fibo.dll ở ví dụ phía trên. CDLL sẽ đại diện thay mặt thay mặt cho library mà toàn bộ chúng ta load và ta hoàn toàn có thể dùng nó để gọi những hàm trong file DLL.


from ctypes import *


external_lib = CDLL(“fibo.dll”)


Sau đó, ta hoàn toàn có thể gọi luôn hàm test_func của external_lib. Trong ví dụ này, ta hoàn toàn có thể pass thẳng một vài kiểu tài liệu (ví như int làm tham số của

test_func) mà tránh việc phải qua data type của ctypes. Tuy nhiên, bạn vẫn nên dùng những data type mà ctypes phục vụ.


a = external_lib.test_func(6)

print(a)


hoặc


n = c_int(6)

a = external_lib.test_func(6)

print(a)


Đều cho ra output là:


Fibonacci up until 6-th digit: 1 1 2 3 5 8

8


Mặc định, kiểu tài liệu trả về sẽ là int. Với ví dụ trên, ta sẽ tránh việc phải code thêm gì cả. Tuy nhiên, với trường hợp dưới đây, ta sẽ nên phải sửa lại code một chút ít.


// test.cpp

#include <iostream>

#include <vector>


extern “C”

__declspec(dllexport) float test_func(float a)

if (97 <= a && a <= 122)

return a – 32;


return 1000000;


# main.py

from ctypes import *


try:

external_lib = CDLL(“test.dll”)


a = external_lib.test_func(6.0)

print(a)

b = external_lib.test_func(100.0)

print(b)

except Exception as e:

print(e)


Nếu như ta chạy đoạn code Python trên, nó sẽ báo lỗi:


argument 1: <class ‘TypeError’>: Don’t know how to convert parameter 1


Mặc dù giá trị 6.0 trong Python có

kiểu tài liệu là float, tuy nhiên, float của Python hoàn toàn khác so với float của C++. Khi đó, ta sẽ phải dùng đến c_float của ctypes để chuyển kiểu tài liệu.


# main.py

from ctypes import *


try:

external_lib = CDLL(“test.dll”)


a = external_lib.test_func(c_float(6.0))

print(a)

b = external_lib.test_func(c_float(100.0))

print(b)

except Exception as e:

print(e)


Lúc này, đoạn code trên sẽ không còn biến thành lỗi convert parameter nữa. Tuy nhiên, kết quả mà hàm trả ra lại không hề đúng chút nào.


Như đã nhắc ở trên, việc gọi hàm ngoài sẽ luôn trả về một giá trị int. Việc dùng sai kiểu tài liệu sẽ ảnh hưởng đến giá trị trả về. Do đó, ta cần định nghĩa lại kiểu tài liệu

trả về của hàm. Việc này được thực thi bằng phương pháp assign attribute restype của function sang một dạng mà ctypes tương hỗ. Với ví dụ trên, đoạn code sau sẽ xử lý và xử lý việc đó:


# main.py

from ctypes import *


try:

external_lib = CDLL(“test.dll”)


#external_lib.test_func.restype = c_float

a = external_lib.test_func(c_float(6.0))

print(a)

b = external_lib.test_func(c_float(100.0))

print(b)

except Exception as e:

print(e)


Bằng cách đổi data type mà function return về sang c_float, ta sẽ đã có được kết quả đúng:


1000000.0

68.0


Như vậy, nội dung bài viết trên đã hướng dẫn những bạn gọi được function được viết bằng C++ ở trong Python. Hy vọng nội dung bài viết này sẽ hữu ích cho những bạn.


Tải thêm tài liệu liên quan đến nội dung bài viết Hướng dẫn python call c code


programming

python

Python call C++

C++ to python

Ctypes Python

Extension Python


Hướng dẫn python call c codeReply
Hướng dẫn python call c code3
Hướng dẫn python call c code0
Hướng dẫn python call c code Chia sẻ


Chia Sẻ Link Cập nhật Hướng dẫn python call c code miễn phí


Bạn vừa đọc tài liệu Với Một số hướng dẫn một cách rõ ràng hơn về Clip Hướng dẫn python call c code tiên tiến và phát triển nhất Share Link Down Hướng dẫn python call c code miễn phí.



Giải đáp vướng mắc về Hướng dẫn python call c code


Nếu sau khi đọc nội dung bài viết Hướng dẫn python call c code vẫn chưa hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Mình lý giải và hướng dẫn lại nha

#Hướng #dẫn #python #call #code

Related posts:

Post a Comment

Previous Post Next Post

Discuss

×Close