2017-05-04 4 views
6

함수가 있습니다. fun(f, x, y) 여기서 x와 y는 숫자이고 f는 "1/x ** 2 + y"과 같은 함수를 지정하는 문자열입니다.Python은 eval 함수를 저장합니다

이 함수는 f을 몇 백만 번 말하면 좋고 각각 xy의 값이 각 용도 사이에서 변경됩니다.
따라서 eval(f)을 호출하면 매번 함수의 값을 계산하는 것보다 상당한 시간이 걸립니다. (측정 된 경우 약 50x)

f이 함수를 저장하는 방법이 없으므로 eval을 한 번만 호출해야합니까?

추신. 여기에 eval을 사용하는 (안전하지 않은) 안전성에 대해 논의하지 마십시오. 알고 있습니다. 그러나이 코드는 제 3자가 실행하는 곳이나 내 질문과 관련이 없습니다.

+4

왜 함수를 문자열로 저장해야합니까? –

+0

사용자가 입력합니다. – Torn

+0

또 다른 옵션은 표현식을 코드 객체로 미리 컴파일하는 것이지만 Jean-François의 기술은 거의 두 배 빠릅니다. –

답변

9

당신은 lambdaeval 수있다, 그래서 당신은 단지 한 번 평가하고,이 함수의 그 후에 사용할 수 있습니다 : 나는 3.25 얻을

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

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

을,하지만 난 xy 많은 시간을 변경할 수 있습니다 I 표현을 다시 평가하지 않아도된다.

관련 문제