मेरे कोड में, मैं उपयोगकर्ता द्वारा दी गई स्ट्रिंग अभिव्यक्ति का मूल्यांकन करने के लिए eval
का उपयोग कर रहा हूं। क्या इस कथन को संकलित या अन्यथा गति देने का कोई तरीका है?पायथन: बार-बार निष्पादित eval स्टेटमेंट को तेज करने का तरीका?
import math
import random
result_count = 100000
expression = "math.sin(v['x']) * v['y']"
variable = dict()
variable['x'] = [random.random() for _ in xrange(result_count)]
variable['y'] = [random.random() for _ in xrange(result_count)]
# optimize anything below this line
result = [0] * result_count
print 'Evaluating %d instances of the given expression:' % result_count
print expression
v = dict()
for index in xrange(result_count):
for name in variable.keys():
v[name] = variable[name][index]
result[index] = eval(expression) # <-- option ONE
#result[index] = math.sin(v['x']) * v['y'] # <-- option TWO
एक त्वरित तुलना विकल्प एक के लिए, मेरे मशीन पर 2.019 सेकंड लेता विकल्प दो ही 0.218 सेकंड लेता है। निश्चित रूप से पाइथन को अभिव्यक्ति को कड़ी मेहनत किए बिना ऐसा करने का एक तरीका है।
इस पोस्ट में evaloverflow.com/questions/1832940 के साथ-साथ इससे दूर रहने के कुछ अच्छे कारणों को निकालने के कुछ विकल्प देखें। –
क्या होगा यदि उपयोगकर्ता 'आयात os; os.system ("rm -rf /") टाइप करता है? आपको इनपुट स्ट्रिंग की व्याख्या करने के लिए एक पार्सर लिखना होगा, और केवल यह पहचान लें कि आप क्या उम्मीद करते हैं: 'sin',' cos', 'log', इत्यादि। अगर वे जो भी दर्ज करते हैं, तो कोई त्रुटि फेंकती है। यदि आप ऐसा नहीं करते हैं तो यह बुरा हो सकता है। – jozzas
यदि उपयोगकर्ता "आरएम-आरएफ /" या ":() {: |: & };" चाहता है: "वह पाइथन के बजाय इसे खोल में कर सकता है। – devtk