2017-05-04 39 views
6

Powiedz, że mam funkcję fun(f, x, y) gdzie x i y są liczbami, a f jest ciągiem określającym funkcję, taką jak "1/x ** 2 + y".Zapisywanie funkcji ewaluacyjnej w języku Python

Chciałbym użyć tej funkcji f dużo, powiedzmy kilka milionów razy, a wartości x i y zmieniają się między każdym użyciem.
Dlatego wywołanie eval(f) zajmuje znaczną ilość czasu, a nie tylko obliczenie wartości funkcji za każdym razem. (Około 50x, w moim mierzonym przypadku).

Czy istnieje sposób na zapisanie tej funkcji f, tak żebym musiał tylko raz zadzwonić pod numer eval?

PS. Proszę nie dyskutować o (nie) bezpieczeństwie używania eval tutaj, jestem tego świadomy, ale ten kod nie będzie nigdzie, w którym strona trzecia go uruchomi, ani nie ma znaczenia dla mojego pytania.

+4

Dlaczego funkcja ma być przechowywana jako ciąg? –

+0

Zostanie wprowadzone przez użytkownika. – Torn

+0

Inną opcją jest wstępne skompilowanie (https://docs.python.org/3/library/functions.html#compile) obiektu kodu, ale technika Jean-François jest prawie dwa razy szybsza. –

Odpowiedz

9

Można evallambda, więc po prostu ocenić to raz, a potem, że jest to funkcja, które można użyć:

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

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

dostaję 3.25, ale mogę zmienić x i y tyle razy ja potrzeba bez ponownej oceny wyrażenia.