Chuyển từ python sang c

Trong những giai đoạn đầu của sự nghiệp lập trình, tôi đã phải làm việc trên một ứng dụng tối ưu hóa toán học C++ được yêu cầu phải có hiệu suất cao. Tôi vẫn nhớ trải nghiệm khó khăn như thế nào

Tôi đã bắt gặp một số khái niệm như con trỏ, đồng thời và thu gom rác mà ban đầu rất khó nắm bắt

rất nhiều người sử dụng Cython để biên dịch mã python của họ trong C để tăng hiệu suất. Nó rất dễ làm và có thể là thứ mà bạn muốn tận dụng

Đảm bảo rằng bạn đã cài đặt Cython trước

Quá trình tổng thể diễn ra như thế này

  • Mang các phần mã của bạn mà bạn muốn chuyển đổi sang c thành một tệp riêng
  • Cung cấp thông tin về loại và cho Cython biết những gì bạn muốn sử dụng trong Python và những gì bạn không sử dụng
  • biên dịch tệp riêng biệt bằng cách sử dụng thiết lập. tập tin py

Trong ví dụ này, giả sử chúng ta muốn biên dịch hàm này thành C

def AddToTen[]:
x = 0
for i in range[1,11]:
x+=i
return x

Điều đầu tiên chúng ta cần làm là di chuyển cái này từ một. tập tin py vào một. pyx, đó là những gì Cython sử dụng. Bây giờ chúng tôi sẽ cung cấp thông tin loại cho các biến của chúng tôi

Bạn muốn đọc câu chuyện này sau?

trong Cython, có ba câu lệnh def

  • cdef. khai báo thứ gì đó sẽ chỉ được sử dụng trong c [như các biến bên trong hàm của chúng ta]
  • pdef. khai báo thứ gì đó sẽ chỉ được sử dụng trong Python
  • cpdef. tuyên bố một cái gì đó điều này sẽ được sử dụng trong cả hai
cpdef int AddToTen[]:
cdef int x = 0
cdef int i
for i in range[1,11]:
x+=i
return x

Vì tôi sẽ không gọi các biến bên trong hàm của chúng ta trong Python, nên tôi đã sử dụng cdef, nhưng đối với chính hàm đó, tôi đã sử dụng cpdef

Ngoài ra, lưu ý rằng chúng tôi đã nhập I trong vòng lặp for và hàm vì nó trả về một int

Bây giờ chúng ta phải biên dịch. pyx. Trong một tệp riêng biệt [của tôi có tên là setup. py], hãy viết đoạn mã sau

from distutils.core import setup
from Cython.Build import cythonize
setup[ext_modules = cythonize['The_Name_Of_Your_Pyx_Here.pyx']]

Cuối cùng, trong terminal [đảm bảo rằng bạn đang ở trong cùng một thư mục], hãy chạy dòng

python setup.py build_ext --inplace

Điều này sẽ biên dịch pyx của bạn và bạn sẽ thấy một tệp có cùng tên với phần mở rộng. c thay vì pyx

Giờ đây, bạn có thể nhập các hàm c của mình vào các tệp python cục bộ, với điều kiện là bạn đã sử dụng cpdef, chỉ bằng cách nhập 'tên tệp của bạn'. Các IDE có xu hướng đưa ra lỗi nhập cho tôi mặc dù chúng đã nhập tốt. Bạn cũng có thể nhập các thư viện python vào tệp pyx, nhưng theo kinh nghiệm của tôi, nó hoạt động giống như trong Python

Khá dễ dàng để thêm các mô-đun tích hợp mới vào Python, nếu bạn biết cách lập trình bằng C. Các mô-đun mở rộng như vậy có thể thực hiện hai việc không thể thực hiện trực tiếp trong Python. họ có thể triển khai các loại đối tượng tích hợp mới và họ có thể gọi các hàm thư viện C và các cuộc gọi hệ thống

Để hỗ trợ các tiện ích mở rộng, API Python [Giao diện lập trình viên ứng dụng] xác định một tập hợp các hàm, macro và biến cung cấp quyền truy cập vào hầu hết các khía cạnh của hệ thống thời gian chạy Python. API Python được tích hợp trong tệp nguồn C bằng cách bao gồm tiêu đề

PyMODINIT_FUNC
PyInit_spam[void]
{
    PyObject *m;

    m = PyModule_Create[&spammodule];
    if [m == NULL]
        return NULL;

    SpamError = PyErr_NewException["spam.error", NULL, NULL];
    Py_XINCREF[SpamError];
    if [PyModule_AddObject[m, "error", SpamError]  import spam
>>> status = spam.system["ls -l"]

Bắt đầu bằng cách tạo một tệp

PyMODINIT_FUNC
PyInit_spam[void]
{
    PyObject *m;

    m = PyModule_Create[&spammodule];
    if [m == NULL]
        return NULL;

    SpamError = PyErr_NewException["spam.error", NULL, NULL];
    Py_XINCREF[SpamError];
    if [PyModule_AddObject[m, "error", SpamError] 

Chủ Đề