programing

함수에 변수를 전달할 때 Python timeit을 사용하는 방법은 무엇입니까?

nasanasas 2020. 10. 26. 08:03
반응형

함수에 변수를 전달할 때 Python timeit을 사용하는 방법은 무엇입니까?


나는 이것을 timeit을 사용하여 어려움을 겪고 있으며 누군가 팁이 있는지 궁금합니다.

기본적으로 속도를 테스트하고 이것을 만든 함수 (값을 전달하는)가 있습니다.

if __name__=='__main__':
    from timeit import Timer
    t = Timer(superMegaIntenseFunction(10))
    print t.timeit(number=1)

하지만 실행할 때 timeit 모듈에서 오는 것과 같은 이상한 오류가 발생합니다. :

ValueError: stmt is neither a string nor callable

자체적으로 기능을 실행하면 제대로 작동합니다. 그 모듈을 시간에 래핑하면 오류가 발생합니다 (큰 따옴표를 사용하고 .. 동일한 출력을 사용하지 않았습니다).

어떤 제안이라도 굉장 할 것입니다!

감사!


호출 가능하게 만드십시오.

if __name__=='__main__':
    from timeit import Timer
    t = Timer(lambda: superMegaIntenseFunction(10))
    print(t.timeit(number=1))

작동해야


Timer(superMegaIntenseFunction(10))"call을 의미 superMegaIntenseFunction(10)하고 결과를 Timer"에 전달합니다 . 그것은 분명히 당신이 원하는 것이 아닙니다. Timer호출 가능 (소리처럼 : 함수와 같이 호출 할 수있는 것) 또는 문자열 (문자열의 내용을 Python 코드로 해석 할 수 있음)을 기대합니다. Timercallable-thing을 반복적으로 호출하고 시간이 얼마나 걸리는지 확인하는 방식으로 작동합니다.

Timer(superMegaIntenseFunction)superMegaIntenseFunction호출 가능 하기 때문에 유형 검사를 통과합니다 . 그러나 Timer전달할 값을 알 수 없습니다 superMegaIntenseFunction.

물론이 문제를 해결하는 간단한 방법은 코드에 문자열을 사용하는 것입니다. 문자열이 새로운 컨텍스트에서 "코드로 해석"되기 때문에 코드에 'setup'인수를 전달해야합니다. 동일한에 대한 액세스 권한이 없으므로 globals정의를 만들기 위해 다른 코드를 실행해야합니다. 사용 가능-@oxtopus의 답변을 참조하십시오.

lambda@Pablo의 답변에서 같이 매개 변수 10superMegaIntenseFunction. 모든 우리가 인수하고, 전화를 취하지 않는 다른 기능을 만드는하고있는 그 superMegaIntenseFunction와를 10. def새 함수가 이름을 얻지 않는다는 점을 제외하고는 다른 함수를 만드는 데 사용한 것과 같습니다 (필요하지 않기 때문에).


문자열을 전달해야합니다.

t = Timer('superMegaIntenseFunction(10)','from __main__ import superMegaIntenseFunction')

향후 방문자를위한 메모입니다. pdb디버거에서 작동하도록해야 superMegaIntenseFunction하고 전역 범위에 속하지 않는 경우 다음을 추가하여 작동하도록 만들 수 있습니다 globals.

globals()['superMegaIntenseFunction'] = superMegaIntenseFunction
timeit.timeit(lambda: superMegaIntenseFunction(x))

이 경우 추가 함수 호출로 인해 타이밍 오버 헤드가 약간 더 큽니다. [출처]


이를 수행하는 한 가지 방법은 'superMegaIntenseFunction'함수가 타이머에서 호출 가능 (즉, ()없이) 또는 timeit.timeit 내부에서 직접 사용되도록 부분을 사용하는 것입니다. partial을 사용하면 타이머가 호출 할 때 함수에 인수가 전달됩니다.

from functools import partial
from timeit import timeit

print(timeit(partial(superMegaIntenseFunction, 10), number=1))

참고 URL : https://stackoverflow.com/questions/7523767/how-to-use-python-timeit-when-passing-variables-to-functions

반응형