2017-05-04 1 views
6

Dites que j'ai une fonction fun(f, x, y) où x et y sont des nombres et f est une chaîne spécifiant une fonction telle que "1/x ** 2 + y".Python sauvegardant une fonction eval

Je souhaite utiliser cette fonction f beaucoup, disons quelques millions de fois, et les valeurs de x et y changent entre chaque utilisation.
Par conséquent appeler eval(f) prend beaucoup de temps au lieu de simplement calculer la valeur de la fonction à chaque fois. (Environ 50x, dans mon cas mesuré.)

Y at-il un moyen d'enregistrer cette fonction f de sorte que je n'aurais besoin d'appeler eval qu'une seule fois?

PS. S'il vous plaît ne pas discuter de la (non) sécurité de l'utilisation eval ici, je suis au courant, mais ce code ne va nulle part où un tiers l'exécutera, ni n'est pertinent à ma question.

+4

Pourquoi avez-vous besoin que la fonction soit stockée sous forme de chaîne? –

+0

Il sera entré par l'utilisateur. – Torn

+0

Une autre option est de pré-compiler (https://docs.python.org/3/library/functions.html#compile) votre expression dans un objet de code, mais la technique de Jean-François est presque deux fois plus rapide. –

Répondre

9

Vous pouvez eval le lambda, vous évaluer juste une fois, et après que c'est une fonction que vous pouvez utiliser:

s = "1/x ** 2 + y" 

s = "lambda x,y: "+s 
f = eval(s) 
x = 2 
y = 3 
print(f(x,y)) 

Je reçois 3.25, mais je peux changer x et y autant de fois que je besoin sans évaluer l'expression à nouveau.