2014-11-04 12 views
5

Ho un file Cython chiamato foo.pyx contenente le seguenti funzioni:Chiamata di funzioni Cython C da Python

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

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

costruisco questo file pyx utilizzando cython -a foo.pyx e possono quindi fare:

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

Quindi sembra come non posso chiamare c_add_one da python. Quali sono i vantaggi di dichiarare una funzione usando cdef?

+4

'cdef' definisce una funzione a cui è possibile accedere _only_ da C. Se si desidera che' c_add_one' sia accessibile da Python, si dovrebbe usare 'cpdef'. Il vantaggio di 'cdef' è quello di rimuovere il sovraccarico del livello Python quando lo si chiama. –

risposta

4
  1. Velocità: Cython e C possono chiamare cdef e cpdef funzioni molto più veloce di funzioni regolari. Le funzioni regolari def sono oggetti Python in piena regola. Richiedono il conteggio dei riferimenti, il GIL, ecc.
  2. Incapsulamento: Se una funzione è dichiarata cdef, non verrà esposta agli utenti Python. Ciò è utile se la funzione non è mai stata concepita per il consumo pubblico (ad esempio perché non controlla i suoi parametri o si riferisce a dettagli di implementazione che potrebbero cambiare in futuro). Gli utenti possono ancora aggirare questo tramite C/Cython, ovviamente, ma farlo è più di una seccatura di quanto la maggior parte si preoccupi di. In questo modo, è simile al doppio manomissione del nome di sottolineatura.
Problemi correlati