Problemi con eval () con Cython
Domanda
I stava cercando di accelerare un po 'di codice, e poi ho provato la compilazione di una classe e una funzione tramite Cython
e WOW! Ho havn't misurato ancora ma sembra almeno 10 volte più veloce.
ho guardato Cython solo due giorni fa, sono molto impressionato!
Tuttavia, non posso ottenere eval () al lavoro.
def thefirst(int a):
d = eval('1+2+a')
return d
I compilare questo per file di module1.pyd e lo chiamano con il file python:
from module1 import thefirst
x = thefirst(2)
print x
Questo restituisce:
NameError:. Nome 'a' non è definito
Ogni aiuto è apprezzato.
Soluzione
Questo perché eval
non ha modo di esaminare l'ambiente per trovare a
. Utilizzare la funzione locals
passarlo l'ambiente.
def thefirst(a):
return eval('1+2+a', locals())
Altri suggerimenti
Si può ottenere via con cython.inline:
http://wiki.cython.org/enhancements/inline
Tuttavia, tenere d'occhio l'utilizzo della memoria del runtime di Python in questo caso. Ogni espressione distinta che viene compilato e caricato occupa parte della memoria. Questo può aggiungere fino se fate questo un sacco.
Hmm, io pensavo eval sarebbe abbastanza male per le prestazioni in ogni caso. Qual è il vostro caso applicativo concreto?