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 문자열 또는 여러 줄 문자열로 지정하거나 콜러블의 이름을 전달할 수 있습니다. - 이름에서 알 수 있듯이
setup
은stmt
를 실행하기 위한 전제 조건으로 한 번만 실행해야 하는 코드 조각을 나타냅니다. 예를 들어 NumPy 배열 생성을 위한 실행 시간을 계산한다고 가정합니다. 이 경우numpy
가져오기는setup
코드이고 실제 생성은 시간을 정할 명령문입니다. - 매개변수
number
는stmt
가 실행되는 횟수를 나타냅니다.number
의 기본값은 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
을 실행하면 repeat
옵션 r
이 기본값 인 5로 설정됩니다. 즉, 지정된 number
stmt
를 실행하면 5번 반복되고 가장 좋은 실행 횟수가 반환됩니다.
timeit을 이용한 문자열 반전 방법 분석
Python 문자열로 작업할 때 문자열을 뒤집을 수 있습니다. 문자열 반전에 대한 가장 일반적인 두 가지 접근 방식은 다음과 같습니다.
- 문자열 슬라이싱 사용
-
reversed()
함수 및join()
메서드 사용
문자열 슬라이싱을 사용하여 역 파이썬 문자열
문자열 슬라이싱이 작동하는 방식과 이를 사용하여 Python 문자열을 반전시키는 방법을 살펴보겠습니다. some-string[start:stop]
구문을 사용하면 start 인덱스에서 start
하여 stop-1
인덱스까지 확장되는 문자열 조각이 반환됩니다. 예를 들어 보겠습니다.
다음 문자열 'Python'을 고려하십시오. 문자열의 길이는 6이고 인덱스 목록은 0, 1, 2에서 5까지입니다.
>>> string_1 = 'Python'
start
값과 stop
값을 모두 지정하면 start
에서 stop-1
까지 확장되는 문자열 슬라이스를 얻습니다. 따라서 string_1[1:4]
는 'yth'를 반환합니다.
>>> string_1 = 'Python' >>> string_1[1:4] 'yth'
start
값을 지정하지 않으면 기본 start
값인 0이 사용되며 슬라이스는 인덱스 0에서 시작하여 stop - 1
까지 확장됩니다.
여기서 stop
값은 3이므로 슬라이스는 인덱스 0에서 시작하여 인덱스 2까지 올라갑니다.
>>> string_1[:3] 'Pyt'
stop
인덱스를 포함하지 않으면 슬라이스가 start
인덱스(1)에서 시작하여 문자열 끝까지 확장되는 것을 볼 수 있습니다.
>>> string_1[1:] 'ython'
start
값과 stop
값을 모두 무시하면 전체 문자열의 조각이 반환됩니다.
>>> string_1[::] 'Python'
step
값으로 조각을 만들어 봅시다. start
, stop
및 step
값을 각각 1, 5 및 2로 설정합니다. 우리는 1에서 시작하여 모든 두 번째 문자 를 포함하는 최대 4(끝점 5 제외)까지 확장되는 문자열 조각을 얻습니다.
>>> string_1[1:5:2] 'yh'
음수 단계를 사용하면 문자열 끝에서 시작하는 슬라이스를 얻을 수 있습니다. 단계를 -2로 설정하면 string_1[5:2:-2]
는 다음 슬라이스를 제공합니다.
>>> string_1[5:2:-2] 'nh'
따라서 문자열의 역 사본을 얻으려면 다음과 같이 start
및 stop
값을 건너뛰고 단계를 -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 함수를 사용하여 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에서 시차를 계산하는 방법을 배웁니다.