timeit의 number는 한 번의 측정에서 실행할 횟수이고, repeat는 그 측정을 몇 번 할지 정합니다. number=10_000, repeat=3이면 1만 번 실행한 합계 시간이 세 개 나옵니다. 각 합계를 1만으로 나누면 해당 묶음의 1회 평균을 구할 수 있습니다.
다음 코드는 가상 입력으로 만든 튜플의 합을 반복해서 구합니다. 한 묶음의 합계는 초로, 같은 합계를 나눈 평균은 마이크로초로 출력합니다.
from timeit import Timer
data = tuple(range(64))
number = 10_000
timer = Timer("sum(data)", globals={"data": data})
totals = timer.repeat(repeat=3, number=number)
print("묶음 수", len(totals))
for index, total in enumerate(totals, start=1):
per_call_us = total / number * 1_000_000
print(f"{index} 합계 {total:.9f} s, 1회 평균 {per_call_us:.6f} us")
첫 줄은 묶음 수 3이고, 그 뒤에 합계와 평균이 세 줄 나옵니다. 시간 수치는 실행마다 달라집니다. 계산용 가상 합계가 0.020초라면 0.020 / 10_000은 0.000002초, 즉 2마이크로초입니다.
목록의 한 값에는 number번의 실행 시간이 들어갑니다
timer.timeit(number=10_000)을 한 번 호출하면 그 묶음의 합계 하나를 초 단위로 받습니다. timer.repeat(repeat=3, number=10_000)은 같은 측정을 세 번 호출해 합계 세 개를 목록으로 돌려줍니다.
sum(totals) / len(totals)는 묶음 한 개의 평균 시간입니다. 모든 묶음의 실행 횟수가 같다면 여기서 다시 number로 나눠 전체 실행의 1회 평균을 초 단위로 구할 수 있습니다. 예제는 양수 횟수를 사용합니다. 이 평균은 측정 루프를 포함한 합계를 실행 횟수로 환산한 값이며, 개별 호출의 지연 시간을 하나씩 잰 결과와는 구분합니다.
setup은 묶음마다 한 번 실행됩니다
아래 가상 리스트에는 원소가 두 개 있습니다. setup에서 리스트를 만든 뒤 pop()을 두 번 실행하는 측정을 두 묶음으로 반복합니다. 이어서 같은 준비 코드로 시작하되 실행 횟수를 세 번으로 바꿉니다.
from timeit import Timer
timer = Timer("items.pop()", setup="items = [10, 20]")
totals = timer.repeat(repeat=2, number=2)
print("완료된 묶음", len(totals))
try:
timer.timeit(number=3)
except IndexError as error:
print(type(error).__name__)
완료된 묶음 2
IndexError
첫 실행이 두 묶음 모두 끝난 이유는 각각 새 리스트로 시작했기 때문입니다. 같은 묶음 안에서는 첫 번째 pop() 뒤에 한 원소만 남고, 두 번째 뒤에는 비어 있습니다. 세 번째 호출에서 IndexError가 발생합니다. 이 예제는 반복 중 입력 상태가 바뀌는 모습을 보여 줍니다.
setup의 준비 시간은 반환된 합계에 들어가지 않습니다. 준비를 포함한 작업 전체가 관심사라면 준비 코드도 측정할 문장에 넣으세요. 서로 다른 코드를 비교할 때는 어떤 입력 상태와 어떤 준비 비용을 각 묶음에 포함했는지 맞춰야 결과를 해석할 수 있습니다.
두 코드 블록은 Windows 11의 CPython 3.14.3에서 따로 실행했습니다. 반복과 준비 구간의 규칙은 Python timeit 문서에서 확인할 수 있습니다. 기본 시계의 의미와 단위가 궁금하다면 time.time과 perf_counter의 역할을 참고하세요.