En mi código, estoy usando eval
para evaluar una expresión de cadena dada por el usuario. ¿Hay alguna forma de compilar o acelerar esta afirmación?Python: ¿forma de acelerar una declaración de evaluación ejecutada repetidamente?
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
Para una comparación rápida UNA opción lleva 2.019 segundos en mi máquina, mientras que la segunda opción tiene sólo 0,218 segundos. Seguramente Python tiene una forma de hacer esto sin codificar la expresión.
Consulte algunas alternativas para evaluar en esta publicación http://stackoverflow.com/questions/1832940, así como algunas buenas razones para mantenerse alejado de ella. –
¿Qué sucede si el usuario escribe 'import os; os.system (" rm -rf/")'? Necesita escribir un analizador para interpretar la cadena de entrada, y solo reconocer lo que espera: 'sin',' cos', 'log', etc. Lanza un error si lo que ingresan no funciona. Podría ser malo si no haces eso. – jozzas
Si el usuario quiere "rm -rf /" o ":() {: |: & };:" puede hacerlo en un shell en lugar de dentro de Python. – devtk