2014-11-04 16 views
5

Tôi đã một file Cython gọi foo.pyx chứa các chức năng sau:Gọi chức năng Cython C từ Python

def add_one(int n): 
    cdef int m = n + 1 
    return m 

cdef int c_add_one(int n): 
    return n + 1 

tôi xây dựng pyx tập tin này bằng cython -a foo.pyx và sau đó có thể làm:

>>> import foo 
>>> foo.add_one(5) 
6 
>>> foo.c_add_one(5) 
AttributeError: 'module' object has no attribute 'c_add_one' 

Vì vậy, nó trông như tôi không thể gọi c_add_one từ python. Những lợi thế của việc khai báo một hàm bằng cách sử dụng cdef là gì?

+4

'cdef' xác định một hàm có thể được truy cập _only_ từ C. Nếu bạn muốn' c_add_one' truy cập được từ Python, bạn nên sử dụng 'cpdef' để thay thế. Ưu điểm của 'cdef' là loại bỏ phần trên của lớp python khi gọi nó. –

Trả lời

4
  1. Speed ​​: Cython và C có thể gọi cdefcpdef chức năng nhanh hơn nhiều so với chức năng thông thường. Các hàm def thông thường là các đối tượng Python đầy đủ. Chúng yêu cầu tính tham chiếu, GIL, v.v.
  2. Đóng gói: Nếu hàm được khai báo cdef, hàm sẽ không được hiển thị cho người dùng Python. Điều này có lợi nếu chức năng không bao giờ được dùng để tiêu thụ công cộng (ví dụ: vì nó không kiểm tra thông số của nó hoặc liên quan đến chi tiết triển khai có thể thay đổi trong tương lai). Người dùng vẫn có thể phá vỡ điều này thông qua C/Cython, tất nhiên, nhưng làm như vậy là nhiều rắc rối hơn là hầu hết sẽ làm phiền với. Theo cách này, nó tương tự như tên mangling đôi gạch dưới.
Các vấn đề liên quan