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

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

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

Python timeit 함수를 사용하는 방법

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

import timeit

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

timeit.timeit(stmt, setup, number)

여기:

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

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

간단한 Python 표현식 타이밍

이 섹션에서는 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 timeit는 timeit을 기본 모듈로 실행함을 나타냅니다.
  • 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을 실행하면 반복 옵션 r이 기본값인 5로 설정됩니다. 즉, 지정된 횟수만큼 stmt를 실행하면 5번 반복되고 가장 좋은 실행 횟수가 반환됩니다.

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

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

  • 문자열 슬라이싱 사용
  • reversed() 함수 및 join() 메서드 사용

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

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

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

>>> string_1 = 'Python'

시작 값과 중지 값을 모두 지정하면 시작에서 중지-1까지 확장되는 스트링 슬라이스가 생성됩니다. 따라서 string_1[1:4] ‘yth’를 반환합니다.

>>> string_1 = 'Python'
>>> string_1[1:4]
'yth'

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

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

>>> string_1[:3]
'Pyt'

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

>>> string_1[1:]
'ython'

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

>>> string_1[::]
'Python'

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

>>> string_1[1:5:2]
'yh'

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

>>> string_1[5:2:-2]
'nh'

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

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

요약: 문자열[::-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

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

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

>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y P'

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

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

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

timeit을 사용한 실행 시간 비교

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

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

>>> 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 함수를 사용하여 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을 사용하여 이 Python 함수 hasDigit()의 실행 시간을 측정하려고 합니다.

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

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

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

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

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에서 시차를 계산하는 방법을 배웁니다.