timeit을 사용하여 Python 코드를 프로파일 링하는 방법

설계 상 Python은 성능보다 편리함, 가독성 및 사용 편의성을 우선시합니다. 하지만 그렇다고 느린 Python 코드에 만족해야한다는 의미는 아닙니다. 속도를 높이기 위해 할 수있는 일이있을 것입니다.

Python 코드의 성능을 프로파일 링하는 데 사용할 수있는 도구 중 가장 간단한 것은 timeit모듈입니다. timeit코드를 수천 또는 수백만 번 실행하고 이러한 실행을 완료하는 데 걸린 시간을보고하여 코드의 작은 조각 (몇 줄, 함수)의 속도를 측정하는 데 사용됩니다.

timeit두세 가지 다른 방법을 비교하고 가장 빠른 방법을 확인하는 데 가장 유용합니다. 예를 들어, 수천 번 반복되는 루프는 일반적인 Python 병목 현상입니다. 손으로 작성한 코드 대신 Python 내장 기능을 사용하여 루프 구현 속도를 높일 수있는 방법을 찾을 수 있다면 측정 가능한 성능 향상을 얻을 수 있습니다.

간단한 Python timeit 예제

다음은 timeit작동 방식에 대한 간단한 예입니다 .

def f1 () : for n in range (100) : pass def f2 () : n = 0 while n <100 : n + = 1 if __name__ == "__main__": import timeit print (timeit.timeit (f1, number = 100000)) print (timeit.timeit (f2, number = 100000)) 

이 프로그램은 루프를 100 번 반복하는 두 가지 방법의 성능을 비교합니다. Python의 내장  range 함수 ( f1)를 사용하고 변수를 증가 ( f2)하는 것입니다. timeit 이러한 접근 방식 각각을 100,000 회 실행하고 각각에 대해 마지막에 총 런타임을 제공합니다. 기본적으로  timeit 에서는 100 만 번의 실행을 사용하지만이 예에서는 적절하게 보이는 수치에 대해 실행 횟수를 설정하는 방법을 보여줍니다.

결과 (Intel i7-3770K 프로세서에서) :

0.1252315

0.45453989999999994

분명히  range 접근 방식은 약 3.75 배로 훨씬 빠릅니다. 이것은 놀라운 일이 아닙니다. Python 내장 기능을 사용하면 일반적으로 Python 객체를 수동으로 조작하는 것보다 더 나은 성능을 얻을 수 있습니다.

문자열을 전달하여 Python timeit 사용

사용하는 또 다른 방법  timeit 은 Python 프로그램으로 평가되는 문자열을 전달하는 것입니다.

시간 가져 오기

print (timeit.timeit ( 'for n in range (100) : pass'))

이 작업은 명령 줄에서도 수행 할 수 있습니다.

python -m timeit "for n in range (100) : pass"

하지만 전체적으로는 위에 표시된 기술을 사용하는 것이 더 쉽습니다. 코드를 어색하게 텍스트 문자열에 넣을 필요가 없기 때문입니다.

Python timeit 팁

있는 그대로 유용하지만  timeit 사용 방법에 대한 다음주의 사항을 명심하십시오.

전체 프로그램 프로파일 링에 timeit을 사용하지 마십시오.

.NET  으로 전체 프로그램 시간을 측정  할 수 없다고 말하는 것은 없습니다  timeit. 예를 들어 간단한 10 줄짜리 스크립트는 이런 방식으로 프로파일 링하기에 나쁜 후보가 아닙니다.

하지만 그 작업을위한 더 나은 도구가 있습니다. 예를 들어 cProfile 전체 프로그램의 성능에 대한 훨씬 더 자세한 통계를 생성하는 Python의  모듈이 있습니다. timeit 단일 구성 요소 또는 코드 스 니펫 (함수 또는 몇 줄의 코드)에서 가장 잘 작동합니다. 그 이상은 일반적으로 의미있는 성능 정보를 제공하기에는 너무 시끄럽고 일관성이없는 결과를 생성합니다.

또한 프로파일 링하는 프로그램을 완료하는 데 몇 분이 걸리더라도  timeit 그다지 유용하지 않습니다. 하나는 코드를 몇 번 이상 실행하는 데 너무 오래 걸리므로 수집 된 타이밍이 매우 조잡 할 것입니다. 두 가지 경우 다른 도구가 작업에 더 적합합니다.

다른 컴퓨터에서 여러 번 실행

프로그램은 매번 같은 속도로 실행되지 않습니다. 최신 컴퓨팅 환경은 리소스, 캐시 동작, 스케줄링 등에 대한 다른 프로그램과의 경쟁과 같은 많은 불확실성을 가져옵니다. timeit 코드 광고를 무한대로 실행하여이를 보완하려고하지만 여러 시도를 집계하는 것이 좋습니다. timeit 프로필을 여러 번 실행  하고 최저 점수와 최고 점수를 버리고 나머지는 평균을 내야합니다.

마지막으로, 다른 시스템에서 동일한 테스트를 실행하는 것도 도움이됩니다. 디스크 바인딩이 기존의 회전 하드 드라이브와 비교하여 SSD에서 어떻게 작동할까요? 성능에 대한 다른 질문과 마찬가지로 추측하지 말고 테스트하십시오.