timeit
모듈을 가지고 놀았을 때 인터페이스가 마음에 들지 않아 다음 두 방법에 비해 그다지 우아하지 않습니다.
다음 코드는 Python 3에 있습니다.
데코레이터 방법
이것은 @Mike의 방법과 거의 동일합니다. 여기에 추가 kwargs
하고 functools
포장하여 더 좋습니다.
def timeit(func):
@functools.wraps(func)
def newfunc(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
elapsedTime = time.time() - startTime
print('function [{}] finished in {} ms'.format(
func.__name__, int(elapsedTime * 1000)))
return newfunc
@timeit
def foobar():
mike = Person()
mike.think(30)
컨텍스트 관리자 방법
from contextlib import contextmanager
@contextmanager
def timeit_context(name):
startTime = time.time()
yield
elapsedTime = time.time() - startTime
print('[{}] finished in {} ms'.format(name, int(elapsedTime * 1000)))
예를 들어 다음과 같이 사용할 수 있습니다.
with timeit_context('My profiling code'):
mike = Person()
mike.think()
그리고 with
블록 내의 코드 는 시간이 정해집니다.
결론
첫 번째 방법을 사용하면 데코레이터를 쉽게 주석 처리하여 일반 코드를 얻을 수 있습니다. 그러나 그것은 함수의 시간을 측정 할 수만 있습니다. 코드의 일부가 함수로 만들지 않는 부분이 있다면 두 번째 방법을 선택할 수 있습니다.
예를 들어, 이제
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
이제 시간을 정하고 싶습니다 bigImage = ...
. 함수로 변경하면 다음과 같습니다.
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
그다지 좋지 않은 것 같습니다 ... nonlocal
키워드 가없는 Python 2를 사용한다면 어떨까요?
대신 두 번째 방법을 사용하는 것이 여기에 매우 적합합니다.
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)