모듈의 실행 시간을 측정할 때 간단하게 쓸 수 있는 timeit에 대해 알아봅시다. 사실 2년 전에 쓰려고 했지만, 이제 와서 쓰게 되네요.

 


 먼저 timeit은 문서에서의 소개를 보면, python code의 실행 시간을 측정하는 방법을 제공합니다. 함수 형태로 제공하는 것과 커멘드 라인으로 제공되는 형태가 있습니다. 함수 형태로 제공되는 것 먼저 보겠습니다.

 

 stmt는 실행될 문장을 의미합니다. number는 몇 번이나 실행될 것인지를 나타냅니다. 저는, 보통 측정해야 할 부분이 있을 때에는 함수로 빼서 많이 하는 편인데요. 한 번 간단하게 작성해 보도록 하겠습니다.

 

 문서에 따르면, 8 ~ 11번째 줄의 의미는 test()를 50만번 실행할 때 걸리는 시간을 측정하는 것입니다.

 

 

 문제는, test가 정의되지 않았다고 뜹니다. 이는 timeit에서 test를 찾지 못했기 때문입니다. 그렇다면, 우리는 test()를 찾을 수 있게 import를 시켜야 합니다. 루트 폴더의 main.py에 정의했으므로, python main.py를 실행시켰다면, __main__에 test가 있는 셈이 됩니다.

 

 

 따라서, timeit을 실행시키기 전에 setup 부분에서 "from __main__ import test" 를 실행시켜야 합니다. 이는, main에 있는 test를 import 하는 것입니다.

 

 이제 실행 결과가 제대로 나오네요. 여기서 다시 정리하면 timeit.timeit에서 number는 실행 횟수를 의미합니다. 그리고, setup은 timeit을 초기화 하는 과정에서 실행할 문장들을 적어놓으면 됩니다.

 

 예를 들어 setup에 from ... import ..를 적어놓으면, timeit이 실행되기 전에 from .. import ..가 실행됩니다. 그런데, 보통 main.py에 함수들이 있는 경우, 문서에 따르면 아래와 같이 global 옵션을 주면 더 편하다고 하니, 참고하셔도 좋을 듯 합니다.

 

 현재 main.py에 정의되어 있는 함수가 test입니다. 현재 모듈에 구현되어 있는 것이기 때문에, globals()는 test도 가져올 수 있습니다. 그렇기 때문에 정상적으로 수행이 됩니다.

 

 globals()에 대한 것은 다음에 자세히 알아보도록 하겠습니다.

 


 이제 실전으로 들어가 봅시다. 저는 dictionary의 update 메소드의 성능을 측정하고 싶습니다. 어떻게 하면 될까요?

 

 

 test_modules 패키지 밑에 있는 dict_modules.py에는 test 함수가 있어요. 이 함수는 그렇게 복잡하지 않고 단순합니다. 단지, 키 "a"와 값 1이 있는 딕셔너리에, 키가 "b"이고, 값 2인 쌍을 update 하게 됩니다. 이 함수를 50만번 호출하면 update의 성능이 측정될 겁니다.

 

 

 이 경우, setup 단계에서 from test_module.dict_module import test를 하면 됩니다. 즉, test_module 패키지의 dict_module 내에 있는 test 함수를 import 하고, 실행 코드를 test()로 적어주면 됩니다. 다음에 number는 50만번을 적어주면 50만번 test() 함수를 실행하게 됩니다.

 

 결과는 요래 나옵니다. 혹은, 이를 command line으로 하는 방법이 없을까요?

 

 

-n은 실행 횟수, 50만 뒤에 있는 문자열은 실행할 script를 의미합니다. 저는 "a"라는 키 하나 있는 딕셔너리에, 키가 "b"이고 값이 3인 것을 업데이트 하는 것을 50만번 실행시켰습니다. 생각해 보니, 알고리즘 과제할 때에도 timeit을 쓰면 정말 손쉽게 실행 시간을 비교할 수 있겠습니다.