在我的代碼中,我使用eval
來評估用戶給出的字符串表達式。有沒有方法可以編譯或以其他方式加快此聲明?Python:加速反覆執行的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秒。當然,Python沒有硬編碼表達式的方法。
看看這個帖子http://stackoverflow.com/questions/1832940以及一些很好的理由遠離它的eval的一些替代品。 –
如果用戶鍵入'import os; os.system(「rm -rf /」)'?你需要編寫一個解析器來解釋輸入字符串,並且只識別你期望的:'sin','cos','log'等等。如果輸入的內容不起作用,則拋出一個錯誤。如果你不這樣做可能會很糟糕。 – jozzas
如果用戶想要「rm -rf /」或「:(){:|:& };:」他可以在shell中而不是在Python中完成。 – devtk