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 = 0for 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 ifor 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 cythonizesetup[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]