Sau khi chơi với timeit
mô-đun, tôi không thích giao diện của nó, nó không được trang nhã so với hai phương pháp sau.
Đoạn mã sau bằng Python 3.
Phương pháp trang trí
Điều này gần giống với phương pháp của @ Mike. Ở đây tôi thêm kwargs
và functools
quấn để làm cho nó tốt hơn.
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)
Phương pháp quản lý ngữ cảnh
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)))
Ví dụ, bạn có thể sử dụng nó như:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Và mã trong with
khối sẽ được tính giờ.
Phần kết luận
Sử dụng phương pháp đầu tiên, bạn có thể bình luận của người trang trí để lấy mã bình thường. Tuy nhiên, nó chỉ có thể định thời gian cho một hàm. Nếu bạn có một số phần mã mà bạn không biết làm cho nó trở thành một hàm, thì bạn có thể chọn phương pháp thứ hai.
Ví dụ, bây giờ bạn có
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Bây giờ bạn muốn thời gian bigImage = ...
dòng. Nếu bạn thay đổi nó thành một hàm, nó sẽ là:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Có vẻ không quá tuyệt vời ... Điều gì sẽ xảy ra nếu bạn đang sử dụng Python 2, không có nonlocal
từ khóa.
Thay vào đó, sử dụng phương pháp thứ hai rất phù hợp ở đây:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)