2017-05-04 46 views
6

Bir fonksiyonum var fun(f, x, y) Burada x ve y sayılar ve f "1/x ** 2 + y" gibi bir işlevi belirten bir dizedir.Python bir eval işlevini kaydetme

Bu işlev f çok, birkaç milyon kez, ve x ve y değerlerinin her kullanım arasında değiştiğini belirtmek isteriz.
Bu nedenle, eval(f) numaralı çağrı, her seferinde işlev değerinin hesaplanmasının aksine önemli bir zaman alır. (Yaklaşık 50x, ölçülen durumumda.)

Bu işlevi f kaydetmek için herhangi bir yol var mı, böylece sadece bir kez eval'u aramak zorundayım?

PS. Lütfen eval'u kullanarak (un) güvenliğini burada tartışmayın, bunun farkındayım, ancak bu kod 3. tarafın çalışacağı herhangi bir yere gitmiyor, ne de benim sorum ile alakalı.

+4

Neden bir dizge olarak depolanacak işleve ihtiyacınız var? –

+0

Kullanıcı tarafından girilecektir. – Torn

+0

Başka bir seçenek ifadenizi bir kod nesnesine önceden derlemek (https://docs.python.org/3/library/functions.html#compile), ancak Jean-François'in tekniği neredeyse iki kat daha hızlıdır. –

cevap

9

Sen lambdaeval, bundan dolayı sadece bir kez değerlendirmek ve bir fonksiyon olduğunu sonra kullanabileceğiniz: Ben 3.25 olsun

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

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

ama x ve y olarak defalarca değiştirebilir Ben ifadeyi tekrar değerlendirmeden gerek.