Python Timeit을 사용하여 코드 시간 측정

게시 됨: 2023-01-17

이 자습서에서는 Python의 timeit 모듈에서 timeit 함수를 사용하는 방법을 배웁니다. Python에서 간단한 식과 함수의 시간을 측정하는 방법을 배웁니다.

코드 시간을 측정하면 코드 조각의 실행 시간을 추정하고 최적화해야 하는 코드 섹션을 식별하는 데 도움이 될 수 있습니다.

Python의 timeit 함수 구문을 배우는 것으로 시작하겠습니다. 그런 다음 예제를 코딩하여 Python 모듈에서 코드 블록과 함수의 시간을 측정하는 방법을 이해합니다. 의 시작하자.

Python timeit 함수를 사용하는 방법

timeit 모듈은 Python 표준 라이브러리의 일부이며 다음과 같이 가져올 수 있습니다.

 import timeit

timeit 모듈에서 timeit 함수를 사용하는 구문은 다음과 같습니다.

 timeit.timeit(stmt, setup, number)

여기:

  • stmt 는 실행 시간을 측정할 코드 조각입니다. 간단한 Python 문자열 또는 여러 줄 문자열로 지정하거나 콜러블의 이름을 전달할 수 있습니다.
  • 이름에서 알 수 있듯이 setupstmt 를 실행하기 위한 전제 조건으로 한 번만 실행해야 하는 코드 조각을 나타냅니다. 예를 들어 NumPy 배열 생성을 위한 실행 시간을 계산한다고 가정합니다. 이 경우 numpy 가져오기는 setup 코드이고 실제 생성은 시간을 정할 명령문입니다.
  • 매개변수 numberstmt 가 실행되는 횟수를 나타냅니다. number 의 기본값은 100만(1000000)이지만 이 매개변수를 원하는 다른 값으로 설정할 수도 있습니다.

timeit() 함수를 사용하는 구문을 배웠으므로 이제 몇 가지 예를 코딩해 보겠습니다.

간단한 Python 표현식 타이밍

Timing-Simple-Python-Expressions

이 섹션에서는 timeit을 사용하여 간단한 Python 표현식의 실행 시간을 측정하려고 합니다.

Python REPL을 시작하고 다음 코드 예제를 실행합니다. 여기서는 10000 및 100000 실행에 대한 지수 및 바닥 나누기 연산의 실행 시간을 계산합니다.

우리는 Python 문자열로 시간을 측정할 명령문을 전달하고 명령문에서 다른 표현식을 구분하기 위해 세미콜론을 사용합니다.

 >>> import timeit >>> timeit.timeit('3**4;3//4',number=10000) 0.0004020999999738706 >>> timeit.timeit('3**4;3//4',number=100000) 0.0013780000000451764

명령줄에서 Python timeit 실행

명령줄에서 timeit 을 사용할 수도 있습니다. 다음은 timeit 함수 호출에 해당하는 명령줄입니다.

 $ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeittimeit 을 기본 모듈로 실행함을 나타냅니다.
  • n 은 코드를 실행해야 하는 횟수를 나타내는 명령줄 옵션입니다. 이는 timeit() 함수 호출의 number 인수와 동일합니다.
  • -s 옵션을 사용하여 설정 코드를 정의할 수 있습니다.

여기서는 명령줄에 상응하는 명령줄을 사용하여 이전 예제를 다시 작성합니다.

 $ python -m timeit -n 100000 '3**4;3//4' 100000 loops, best of 5: 35.8 nsec per loop

이 예제에서는 내장 len() 함수의 실행 시간을 계산합니다. 문자열의 초기화는 s 옵션을 사용하여 전달되는 설정 코드입니다.

 $ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)' 100000 loops, best of 5: 239 nsec per loop

출력에서 최고 5 회 실행에 대한 실행 시간을 얻었음을 알 수 있습니다. 이것은 무엇을 의미 하는가? 명령줄에서 timeit 을 실행하면 repeat 옵션 r기본값 인 5로 설정됩니다. 즉, 지정된 number stmt 를 실행하면 5번 반복되고 가장 좋은 실행 횟수가 반환됩니다.

timeit을 이용한 문자열 반전 방법 분석

Python 문자열로 작업할 때 문자열을 뒤집을 수 있습니다. 문자열 반전에 대한 가장 일반적인 두 가지 접근 방식은 다음과 같습니다.

  • 문자열 슬라이싱 사용
  • reversed() 함수 및 join() 메서드 사용
분석-중-문자열-반전-방법-사용-timeit

문자열 슬라이싱을 사용하여 역 파이썬 문자열

문자열 슬라이싱이 작동하는 방식과 이를 사용하여 Python 문자열을 반전시키는 방법을 살펴보겠습니다. some-string[start:stop] 구문을 사용하면 start 인덱스에서 start 하여 stop-1 인덱스까지 확장되는 문자열 조각이 반환됩니다. 예를 들어 보겠습니다.

다음 문자열 'Python'을 고려하십시오. 문자열의 길이는 6이고 인덱스 목록은 0, 1, 2에서 5까지입니다.

이미지-76
 >>> string_1 = 'Python'

start 값과 stop 값을 모두 지정하면 start 에서 stop-1 까지 확장되는 문자열 슬라이스를 얻습니다. 따라서 string_1[1:4] 는 'yth'를 반환합니다.

이미지-77
 >>> string_1 = 'Python' >>> string_1[1:4] 'yth'

start 값을 지정하지 않으면 기본 start 값인 0이 사용되며 슬라이스는 인덱스 0에서 시작하여 stop - 1 까지 확장됩니다.

이미지-78

여기서 stop 값은 3이므로 슬라이스는 인덱스 0에서 시작하여 인덱스 2까지 올라갑니다.

 >>> string_1[:3] 'Pyt'

stop 인덱스를 포함하지 않으면 슬라이스가 start 인덱스(1)에서 시작하여 문자열 끝까지 확장되는 것을 볼 수 있습니다.

이미지-80
 >>> string_1[1:] 'ython'

start 값과 stop 값을 모두 무시하면 전체 문자열의 조각이 반환됩니다.

이미지-81
 >>> string_1[::] 'Python'

step 값으로 조각을 만들어 봅시다. start , stopstep 값을 각각 1, 5 및 2로 설정합니다. 우리는 1에서 시작하여 모든 두 번째 문자 를 포함하는 최대 4(끝점 5 제외)까지 확장되는 문자열 조각을 얻습니다.

이미지-82
 >>> string_1[1:5:2] 'yh'

음수 단계를 사용하면 문자열 끝에서 시작하는 슬라이스를 얻을 수 있습니다. 단계를 -2로 설정하면 string_1[5:2:-2] 는 다음 슬라이스를 제공합니다.

이미지-83
 >>> string_1[5:2:-2] 'nh'

따라서 문자열의 역 사본을 얻으려면 다음과 같이 startstop 값을 건너뛰고 단계를 -1로 설정합니다.

 >>> string_1[::-1] 'nohtyP'

요약: string[::-1] 은 문자열의 역 사본을 반환합니다.

내장 함수와 문자열 메서드를 사용하여 문자열 반전

Python의 내장 reversed() 함수는 문자열 요소에 대해 역 반복자를 반환합니다.

 >>> string_1 = 'Python' >>> reversed(string_1) <reversed object at 0x00BEAF70>

따라서 for 루프를 사용하여 역 반복자를 반복할 수 있습니다.

 for char in reversed(string_1): print(char)

그리고 역순으로 문자열의 요소에 액세스합니다.

 # Output n o h t y P

그런 다음 <sep>.join(reversed(some-string)) 구문을 사용하여 역 반복자에서 join() 메서드를 호출할 수 있습니다.

아래 코드 스니펫은 구분 기호가 각각 하이픈과 공백인 몇 가지 예를 보여줍니다.

 >>> '-'.join(reversed(string1)) 'nohtyP' >>> ' '.join(reversed(string1)) 'nohty P'

여기서는 구분 기호를 원하지 않습니다. 따라서 문자열의 역 사본을 얻으려면 구분 기호를 빈 문자열로 설정하십시오.

 >>> ''.join(reversed(string1)) 'nohtyP'

''.join(reversed(some-string)) 을 사용하면 문자열의 반전된 복사본이 반환됩니다.

timeit을 사용한 실행 시간 비교

지금까지 우리는 파이썬 문자열을 뒤집는 두 가지 접근 방식을 배웠습니다. 그러나 그들 중 어느 것이 더 빠릅니까? 알아 보자.

간단한 Python 표현식의 시간을 측정한 이전 예제에는 setup 코드가 없었습니다. 여기서는 Python 문자열을 뒤집습니다. 문자열 반전 작업이 number 로 지정된 number 동안 실행되는 동안 setup 코드는 한 번만 실행되는 문자열의 초기화입니다.

 >>> import timeit >>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000) 0.04951830000001678 >>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000) 0.12858760000000302

주어진 문자열을 뒤집기 위한 동일한 수의 실행에 대해 문자열 슬라이싱 접근 방식은 join() 메서드 및 reversed() 함수를 사용하는 것보다 빠릅니다.

timeit을 사용하여 Python 함수 타이밍

타이밍-파이썬-함수-timeit 사용

이 섹션에서는 timeit 함수를 사용하여 Python 함수의 시간을 측정하는 방법을 알아봅니다. 문자열 목록이 주어지면 다음 hasDigit 함수는 적어도 하나의 숫자가 있는 문자열 목록을 반환합니다.

 def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit

이제 timeit 을 사용하여 이 파이썬 함수 hasDigit() 의 실행 시간을 측정하고 싶습니다.

먼저 시간이 지정될 명령문( stmt )을 식별해 보겠습니다. 문자열 목록을 인수로 사용하여 hasDigit() 함수를 호출합니다. 다음으로 설정 코드를 정의하겠습니다. setup 코드가 무엇인지 짐작할 수 있습니까?

함수 호출이 성공적으로 실행되려면 설정 코드에 다음이 포함되어야 합니다.

  • 함수 hasDigit() 의 정의
  • 문자열 인수 목록의 초기화

아래와 같이 setup 문자열에 설정 코드를 정의해 보겠습니다.

 setup = """ def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit thislist=['puffin3','7frost','blue'] """

다음으로 timeit 함수를 사용하여 100000회 실행에 대한 hasDigit() 함수의 실행 시간을 얻을 수 있습니다.

 import timeit timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
 # Output 0.2810094920000097

결론

Python의 timeit 함수 를 사용하여 표현식, 함수 및 기타 콜러블의 시간을 측정하는 방법을 배웠습니다. 이를 통해 코드를 벤치마킹하고 동일한 함수의 다양한 구현 실행 시간을 비교하는 등의 작업을 수행할 수 있습니다.

이 튜토리얼에서 배운 내용을 복습해 봅시다. timeit.timeit(stmt=...,setup=...,number=...) 구문과 함께 timeit() 함수를 사용할 수 있습니다. 또는 명령줄에서 timeit을 실행하여 짧은 코드 스니펫의 시간을 측정할 수 있습니다.

다음 단계로 line-profiler 및 memprofiler와 같은 다른 Python 프로파일링 패키지를 사용하여 각각 시간 및 메모리에 대한 코드를 프로파일링하는 방법을 탐색할 수 있습니다.

다음으로 Python에서 시차를 계산하는 방법을 배웁니다.