« Trước 1 2 3 Tiếp »>> import helloworld
Hello World Nó đã làm việc. Đây là các bước cơ bản để tạo mã nhị phân [đối tượng dùng chung] đã biên dịch của mã Python Để bắt đầu, tôi sẽ lấy một số mã Python đơn giản từ ví dụ Numba và tính tổng của danh sách một chiều. Mặc dù tôi chắc chắn rằng có mã tốt hơn để tính tổng, nhưng ví dụ này sẽ hướng dẫn bạn cách thực hiện một ví dụ toán học hơn Đối với ví dụ này, một hàm đơn giản trong tổng. tệp pyx tính tổng Mã này được biên dịch giống như mã Hello World, với sự thay đổi đối với hàm Python trong thiết lập. py để cythonize sum. pyx. Mã trong Liệt kê 4 kiểm tra mô-đun trong sổ ghi chép Jupyter Liệt kê 4. Kiểm tra tổng kếtdef sum[x]:
total = 0
for i in range[x.shape[0]]:
total += x[i]
return total
import sum import numpy x = numpy.arange[10_000_000]; %time sum.sum[x] CPU times: user 1.37 s, sys: 0 ns, total: 1.37 s Wall time: 1.37 s
Lưu ý rằng tổng là đối tượng và tổng. sum là hàm bên trong đối tượng, nghĩa là bạn có thể đặt nhiều hàm trong mã Python của mình. Cũng lưu ý rằng thời gian để chạy mã giống như Python thuần túy. Mặc dù bạn có thể tối ưu hóa mã Cython bằng cách sử dụng OpenMP chẳng hạn, tôi sẽ không thảo luận điều đó ở đây
công ty
Cython lấy mã Python, chuyển đổi nó thành C và biên dịch nó cho bạn, nhưng nếu bạn có sẵn mã C mà bạn muốn sử dụng trong Python như một mô-đun Python thì sao?
Thư viện hàm ngoại ctypes cung cấp các loại dữ liệu tương thích với C và cho phép bạn gọi các hàm trong thư viện liên kết động [DLL] hoặc thư viện dùng chung từ bên trong Python. Về bản chất, nó “bao bọc” các thư viện này để chúng có thể được gọi từ Python. Bạn có thể tìm thấy ctypes với hầu hết mọi bản phân phối Python
Để sử dụng ctypes, bạn thường bắt đầu với mã C/C++ của mình và tạo đối tượng có thể chia sẻ như bình thường. Tuy nhiên, hãy đảm bảo sử dụng cờ mã độc lập với vị trí [PIC] và cờ được chia sẻ [bạn sẽ xây dựng một thư viện]. Ví dụ: với gcc, bạn sử dụng các tùy chọn -fPIC và -shared
$ gcc -fPIC -shared -o libsource.so source.c
Bạn có quyền biên dịch mã C và tạo thư viện bằng bất kỳ phương pháp nào bạn muốn, miễn là bạn sử dụng các tùy chọn -fPIC và -shared
Trong ví dụ trước, hầu hết công việc được thực hiện trong phần tổng kết, vì vậy bây giờ tôi sẽ viết lại quy trình đó trong C để có hiệu suất tốt hơn. Theo một hướng dẫn trực tuyến, một ví dụ bằng C để tính tổng và xây dựng nó thành một thư viện được hiển thị trong Liệt kê 5
Liệt kê 5. Tổng kết C
________số 8Hàm được đặt tên là sum_function và mã sum. c. Mã này có thể được biên dịch thành đối tượng dùng chung [thư viện] với gcc
$ gcc -fPIC -shared -o libsum.so sum.c
Trình biên dịch tạo đối tượng dùng chung libsum. Vì vậy, một thư viện
Để sử dụng thư viện trong Python, cần có một vài hàm và biến ctypes cụ thể trong Python. Bởi vì nó có thể làm cho mã Python hơi phức tạp, nên tôi viết một “hàm bao bọc” cho thư viện bằng Python [Liệt kê 6]
Liệt kê 6. Chức năng trình bao bọc
from distutils.core import setup from Cython.Build import cythonize setup[ ext_modules = cythonize["helloworld.pyx"] ]0
Lưu ý rằng hàm cụ thể sum_function được xác định. Nếu bạn có một thư viện có nhiều chức năng, bạn sẽ phải tạo giao diện cho từng chức năng trong tệp này
Bây giờ để kiểm tra hàm C trong Python
from distutils.core import setup from Cython.Build import cythonize setup[ ext_modules = cythonize["helloworld.pyx"] ]1
Con đại bàng đã hạ cánh. nó hoạt động. Tuy nhiên, bạn có thể nhận thấy rằng nó chậm hơn cả mã Python thuần túy. Rất có thể cường độ số học không đủ lớn để cho thấy sự cải thiện. Đừng để điều này ngăn cản bạn. Bạn luôn nên dùng thử ctypes nếu muốn hoặc cần hiệu suất cao hơn