2017-05-04 18 views
6

Giả sử tôi có hàm fun(f, x, y) trong đó x và y là số và f là một chuỗi chỉ định một hàm chẳng hạn như "1/x ** 2 + y".Python lưu hàm eval

Tôi muốn sử dụng chức năng này f nhiều, giả sử vài triệu lần và các giá trị của xy thay đổi giữa mỗi lần sử dụng.
Do đó, hãy gọi eval(f) mất một khoảng thời gian đáng kể thay vì chỉ tính giá trị của hàm mỗi lần. (Khoảng 50x, trong trường hợp đã đo của tôi.)

Có cách nào để lưu chức năng này f để tôi chỉ phải gọi eval một lần?

PS. Vui lòng không thảo luận về (un) sự an toàn của việc sử dụng eval tại đây, tôi biết điều đó, nhưng mã này sẽ không đi đến bất kỳ nơi nào mà bên thứ ba sẽ chạy nó, cũng như không liên quan đến câu hỏi của tôi.

+4

Tại sao bạn cần chức năng được lưu trữ dưới dạng chuỗi? –

+0

Nó sẽ được người dùng nhập vào. – Torn

+0

Một tùy chọn khác là để [biên dịch] (https://docs.python.org/3/library/functions.html#compile) biểu thức của bạn thành đối tượng mã, nhưng kỹ thuật của Jean-François nhanh gấp hai lần. –

Trả lời

9

Bạn có thể eval các lambda, vì vậy bạn chỉ đánh giá nó một lần, và sau đó nó là một chức năng mà bạn có thể sử dụng:

s = "1/x ** 2 + y" 

s = "lambda x,y: "+s 
f = eval(s) 
x = 2 
y = 3 
print(f(x,y)) 

tôi nhận được 3.25, nhưng tôi có thể thay đổi xy như nhiều lần tôi cần mà không đánh giá lại biểu thức.