2013-07-30 9 views
16

Quando si scrive codice Python, il mio tipico flusso di lavoro è quello di utilizzare il prompt interattivo e fare qualcosa di similecome ricaricare un modulo Cython modo interattivo usando pyximport

write function 
repeat until working: 
    test function 
    edit function 

Una volta che sono abbastanza sicuro che tutto è ok, corro il codice in modalità non interattiva e raccoglie i risultati.

A volte le funzioni funzionano un po 'troppo lentamente e devono essere ottimizzate.

Sono interessato all'utilizzo di cython per ottimizzare queste funzioni lente, ma voglio mantenere il mio flusso di lavoro interattivo, ad esempio, eseguire le funzioni, apportare modifiche, eseguirle nuovamente.

C'è un modo semplice per farlo?

Finora ho provato a mettere le mie funzioni Cython in un modulo "my_functions.pyx" separati:

def fun1(int x): 
    return x + 130 

def fun2(int x): 
    return x/30 

Poi esecuzione (al prompt interative)

import pyximport; pyximport.install() 
import my_functions as mf 
mf.fun1(25) 

Questo funziona la prima tempo, ma voglio apportare modifiche alle mie funzioni cython e ricaricarle nella stessa sessione interattiva.

esecuzione

import my_functions as mf 

non aggiorna le funzioni affatto. E in esecuzione

reload(mf) 

dà un errore: No module named my_functions

L'unica cosa che funziona è quello di uscire dalla sessione corrente, riavviare ipython, e importare il modulo tutto nuovo. Ma questo tipo di uccide i benefici dell'esecuzione interattiva.

Esiste un modo migliore per ottimizzare le funzioni con cython in modo interattivo?

In caso contrario, è possibile descrivere altri modi per avvicinarsi all'ottimizzazione del codice con cython?

Qualsiasi aiuto è apprezzato.

+0

Il problema è che i moduli cython sono compilati in librerie condivise, che non possono essere ricaricate dalla funzione 'reload'. AFAIK al momento non puoi semplicemente scaricare una libreria condivisa, quindi dovrai riavviare l'interprete. Nota che puoi evitare di riavviare * ipython * se usi la console Qt: usa 'Ctrl +.'per riavviare solo il kernel, senza riavviare l'intera console. – Bakuriu

risposta

28

Ho trovato una funzione scarsamente documentata nella funzione "pyximport.install" che consente di ricaricare un modulo cython. Con questa funzione impostata su True, puoi caricare/ricaricare i tuoi moduli cython in modo interattivo senza dover riavviare python.

Se si inizializza il modulo Cython con:

import pyximport 
pyximport.install(reload_support=True) 
import my_functions as mf 

È possibile apportare modifiche al tuo modulo Cython, e quindi ricaricare con:

reload(mf) 

Speriamo che questo sarà utile a qualcuno.

+0

Fantastico. Qualcuno sa perché non è l'impostazione predefinita? – daknowles

Problemi correlati