timeit
Modül ile oynadıktan sonra , aşağıdaki iki yönteme göre çok şık olmayan arayüzünü beğenmedim.
Aşağıdaki kod Python 3'tedir.
Dekoratör yöntemi
Bu, @ Mike'ın yöntemiyle neredeyse aynıdır. İşte ben eklemek kwargs
ve functools
daha iyi hale getirmek için sarı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)
Bağlam yöneticisi yöntemi
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)))
Örneğin, bunu şu şekilde kullanabilirsiniz:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Ve with
blok içindeki kod zamanlanmış olacaktır.
Sonuç
İlk yöntemi kullanarak, normal kodu almak için dekoratör hakkında e-posta yoluyla yorum yapabilirsiniz. Ancak, yalnızca bir işlevi zamanlayabilir. Kodun bir kısmına sahipseniz, onu işlev yapmak için ne yapacağınızı bilmiyorsanız, ikinci yöntemi seçebilirsiniz.
Örneğin, şimdi sahipsin
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Şimdi bigImage = ...
çizgiyi ölçmek istiyorsun . Bunu bir işleve değiştirirseniz, şu olur:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Pek harika görünmüyor ... Ya Python 2'deyseniz, nonlocal
anahtar kelime 2'deyseniz.
Bunun yerine, ikinci yöntemi kullanmak buraya çok iyi uyuyor:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)