2014-01-26 3 views
0

필자가 작성한 두 가지 방법으로 timeit 함수를 사용하여 일부 메트릭을 실행하고 있는데 문제가 있습니다. 단순화 된 예는 아래 파일을 참조하십시오timeit에 사용할 함수를 올바르게 가져 오는 방법

fileA.py을이 단독으로 실행하고 나는 timeit과 기능, foo를 테스트하기 위해 노력하고있어 :

if (len(sys.argv) < 2): 
    print "Need a command line argument, exiting" 
    sys.exit(1) 

def foo(n): 
    #does some stuff, returns an int 

이 기능은 잘 독립, 내가 실행할 수있는 작품을 그것과 같이 ./fileA.py 5

나는 foo의 다른 구현 인 fileB.py과 비슷한 파일을 가지고있다. 그러나 foo의 내부를 제외하고는 정확히 같다.

지금 나는 내가 모두 FILEA에 timeit 사용하기 위해 노력하고있어 FILEC 및 fileB (생략 fileB 부분)이 있습니다

for n in range(0,10): 
    setupStr = 'from fileA import foo' 
    setupStr += '; from __main__ import n' 
    mytime = timeit.Timer('foo(n)', setupStr) 
    timeTaken = mytime.timeit(1) 
    print #results, not important 

내가 점점 오전 문제입니다 내가 FILEC를 실행할 때. py, "명령 행 인수, exitng가 필요합니다"가 나오고 종료됩니다. 이 파일 fileA.py에서 오는 이해하지만,이 코드 부분을 전혀 실행되는 이유는 무엇입니까? 나는 timeit이 작동하는 방식으로, fileA에서 foo 만 가져올 것이라고 생각하고 있었다. 내가 틀렸다고 생각 하나? 그렇다면 어떻게하면이 문제를 해결할 수있는 가장 좋은 방법이 될 수 있습니까? 따라서 foo(n) 메서드를 테스트하고 필요한 명령 줄 인수로 독립 실행 형 fileA의 기능을 유지할 수 있습니까?

+1

것은 또한 단순화 할 수 있습니다 :

if __name__ == '__main__': if (len(sys.argv) < 2): ... 

좀 더 자세한 설명은이 질문에 대한 허용 대답을 참조하십시오 :이 문제를 방지하려면 fileA가에 독립형 호출되는 경우에만 실행해야하는데 코드를 포장 타이밍에 대한 접근 방식은 가져 오기 문제를 해결하지 못한다 : 먼저 모듈을 직접 가져온 다음'functools.partial'을 사용하여 코드가있는 문자열 대신에'timeit'에 직접 전달하는 호출 가능 함수를 작성하십시오). –

+0

@KarlKnechtel Nifty, 저는 꽤 자주 timeit을 사용할 것입니다 (이것은 데이터 구조의 과정입니다). 그래서 다음 번에 시도해 보겠습니다. – turbo

답변

2

파이썬은 from fileA import foo를 해결하기 위해 전체 fileA 모듈을 평가한다 - 될 모듈 수준 변수 이름이 아닌 정확한 값을 얻기 위해 평가되어야 할 것이다 코드에 의해 생성 된 기능을 foo이 완벽하게 합법적 인 것 . What does if __name__ == "__main__": do?

+0

완벽하게 작동했습니다. 감사합니다! 자세한 설명에 대한 링크를 추가해 주셔서 감사드립니다. – turbo

관련 문제