In meinem Code verwende ich eval
, um einen vom Benutzer angegebenen Zeichenfolgenausdruck auszuwerten. Gibt es eine Möglichkeit, diese Aussage zu kompilieren oder anderweitig zu beschleunigen?Python: Möglichkeit, eine wiederholt ausgeführte Eval-Anweisung zu beschleunigen?
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
Für einen schnellen Vergleich Option ONE nimmt 2,019 Sekunden auf meiner Maschine, während Option ZWEI nur 0,218 Sekunden dauert. Sicherlich hat Python eine Möglichkeit, dies zu tun, ohne den Ausdruck hart zu codieren.
Überprüfen Sie einige Alternativen zu Eval in diesem Beitrag http://StackOverflow.com/Questions/1832940 sowie einige gute Gründe, sich davon fern zu bleiben. –
Was passiert, wenn der Benutzer 'import os; os.system (" rm -rf/")'? Sie müssen einen Parser schreiben, um die Eingabe-Zeichenkette zu interpretieren, und nur erkennen, was Sie erwarten: 'sin',' cos', 'log', etc. Wirf einen Fehler, wenn das, was sie eingeben, nicht funktioniert. Es könnte schlimm sein, wenn du das nicht tust. – jozzas
Wenn der Benutzer möchte "rm -rf /" oder ":() {: |: & };:" Er kann es in einer Shell statt in Python tun. – devtk