Gọi thư viện C từ Python
Các thư viện C và C++ bên ngoài có thể được gọi từ mã Python bằng một số tùy chọn, sử dụng e. g. Cython, CFFI, pybind11 và ctypes. Chúng tôi sẽ thảo luận về hai điều cuối cùng, bởi vì chúng yêu cầu ít bản soạn sẵn nhất, đối với các trường hợp đơn giản - đối với các ví dụ phức tạp hơn có thể không đúng với trường hợp đó. Hãy xem xét chương trình C đơn giản này, kiểm tra. c, cộng các số liên tiếp Show
Bạn có thể dễ dàng biên dịch và liên kết nó thành một đối tượng được chia sẻ (. vì vậy) tập tin. Trước tiên, bạn cần pybind11. Bạn có thể cài đặt nó theo một số cách, như pip, nhưng tôi thích tạo môi trường ảo hơn bằng pipenv
tạo ra một đối tượng chia sẻ 1 mà bạn có thể gọi từ trình bao iPython, như thế này
Bây giờ bạn có thể muốn kiểm tra đầu ra, bằng cách so sánh với công thức nổi tiếng về tổng các số nguyên liên tiếp
Đặt cho tập lệnh này một cái tên phù hợp, chẳng hạn như 2. Điều tương tự có thể được thực hiện bằng cách sử dụng ctypes thay vì pybind11, nhưng yêu cầu bản soạn sẵn nhiều hơn một chút ở phía Python của mã và ít hơn một chút ở phía C. Bài kiểm tra. c sẽ chỉ là thuật toán
Biên dịch và liên kết bằng cách sử dụng
mà tạo ra một libtest. vì vậy tập tin Bạn sẽ cần thêm một số bản soạn sẵn ________số 8_______ Một lần nữa, bạn có thể so sánh với công thức tính tổng các số nguyên liên tiếp
Hiệu suấtBây giờ chúng ta có thể tính thời gian cho thư viện 3 C đã biên dịch của mình, e. g. từ giao diện iPython
Nếu bạn so sánh với thời gian Numba từ chương 3, bạn sẽ thấy rằng thư viện C cho 3 nhanh hơn tính toán numpy nhưng chậm hơn đáng kể so với hàm trang trí 5
Truyền mảng Numpy cho thư viện CBây giờ chúng ta hãy xem xét một ví dụ phức tạp hơn. Thay vì tính tổng các số đến một giới hạn trên nhất định, chúng ta hãy tính tổng đó cho một mảng các giới hạn trên. Điều này sẽ trả về một mảng các khoản tiền. Việc sửa đổi mã C và Python của chúng tôi để hoàn thành việc này khó đến mức nào? 7Bây giờ hãy xem điều gì sẽ xảy ra nếu chúng ta chuyển 1 một mảng thay vì một số nguyên 8cho 9Nó không sụp đổ. Thay vào đó, nó trả về một mảng mà bạn có thể kiểm tra xem có đúng không bằng cách lấy mỗi tổng trừ đi tổng trước đó (trừ tổng đầu tiên) 0cái nào mang lại 1các yếu tố của 5 - ngoại trừ yếu tố cuối cùng - như bạn mong đợiGọi đồng thời thư viện C từ nhiều luồngChúng tôi có thể nhanh chóng chỉ cho bạn cách thư viện C được biên dịch bằng pybind11 có thể chạy đa luồng. hãy thử cách sau từ vỏ iPython 2cho 3Bây giờ, hãy thử song song hóa đơn giản 20 cuộc gọi của 3, trên hai luồng, do đó, 10 lệnh gọi trên mỗi luồng. Quá trình này sẽ mất khoảng 7 nếu quá trình xử lý song song đang chạy mà không có chi phí. Hãy thử 4điều này mang lại 5i. e. nhiều hơn gấp đôi thời gian chúng ta mong đợi. Điều thực sự xảy ra là 3 được chạy tuần tự thay vì song song. Chúng ta cần thêm một khai báo để kiểm tra. c. 9 7như thế này 7Bây giờ biên dịch lại 8Nhập lại đối tượng được chia sẻ đã xây dựng lại - điều này chỉ có thể được thực hiện bằng cách thoát và khởi chạy lại trình thông dịch iPython - và lặp lại lần nữa 9điều này mang lại 0như bạn mong đợi đối với hai mô-đun 3 chạy song song
|