2017-05-04 6 views
6

कहें कि मेरे पास fun(f, x, y) फ़ंक्शन है जहां x और y संख्याएं हैं और f "1/x ** 2 + y" जैसे फ़ंक्शन को निर्दिष्ट करने वाली स्ट्रिंग है।पायथन एक eval फ़ंक्शन को सहेज रहा है

मैं इस फ़ंक्शन का उपयोग f बहुत कुछ कहना चाहता हूं, कुछ मिलियन बार कहता हूं, और x और y के मान प्रत्येक उपयोग के बीच बदलते हैं।
इसलिए eval(f) पर कॉल करने से प्रत्येक बार फ़ंक्शन के मूल्य की गणना करने के विरोध में काफी समय लगता है। (लगभग 50x, मेरे मापा मामले में।)

क्या इस फ़ंक्शन को f सहेजने का कोई तरीका है ताकि मुझे केवल eval पर कॉल करना पड़े?

पीएस। कृपया eval का उपयोग करने की (एन) सुरक्षा पर चर्चा न करें, मुझे इसके बारे में पता है, लेकिन यह कोड कहीं भी नहीं जा रहा है जहां कोई तीसरी पार्टी इसे चलाएगी, न ही यह मेरे प्रश्न के लिए प्रासंगिक है।

+4

स्ट्रिंग के रूप में संग्रहीत करने के लिए आपको फ़ंक्शन की आवश्यकता क्यों है? –

+0

यह उपयोगकर्ता द्वारा इनपुट किया जाएगा। – Torn

+0

एक और विकल्प एक कोड ऑब्जेक्ट में अपनी अभिव्यक्ति को पूर्व-[संकलित] (https://docs.python.org/3/library/functions.html#compile) करना है, लेकिन जीन-फ्रैंकोइस की तकनीक लगभग दोगुनी है। –

उत्तर

9

आप lambdaeval सका, इसलिए आप बस इसे एक बार मूल्यांकन, और उसके बाद यह एक समारोह है आप का उपयोग करें कि कर सकते हैं:

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

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

मैं 3.25 मिलता है, लेकिन मैं x और y रूप में कई बार बदल सकते हैं मैं फिर से अभिव्यक्ति का मूल्यांकन किए बिना जरूरत है।

संबंधित मुद्दे