Trong mã của tôi, tôi đang sử dụng eval
để đánh giá một biểu thức chuỗi do người dùng đưa ra. Có cách nào để biên dịch hay tăng tốc tuyên bố này không?Python: Cách để tăng tốc độ câu lệnh eval được thực hiện liên tục?
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
Để có tùy chọn so sánh nhanh ONE mất 2.019 giây trên máy, trong khi tùy chọn TWO chỉ mất 0,18 giây. Chắc chắn Python có một cách để làm điều này mà không cần mã hóa cứng biểu thức.
Kiểm tra một số lựa chọn thay thế để đánh giá bài đăng này http://stackoverflow.com/questions/1832940 cũng như một số lý do chính đáng để tránh xa nó. –
nếu người dùng nhập 'os os; os.system (" rm -rf/")' thì sao? Bạn cần phải viết một trình phân tích cú pháp để giải thích chuỗi đầu vào và chỉ nhận ra những gì bạn mong đợi: 'sin',' cos', 'log', v.v. Ném một lỗi nếu những gì chúng nhập vào không hoạt động. Nó có thể là xấu nếu bạn không làm điều đó. – jozzas
Nếu người dùng muốn "rm -rf /" hoặc ":() {: |: & };:" anh ấy có thể làm điều đó trong trình bao thay vì trong Python. – devtk