Setelah bermain dengan timeit
modul, saya tidak suka antarmukanya, yang tidak begitu elegan dibandingkan dengan dua metode berikut.
Kode berikut ada di Python 3.
Metode dekorator
Ini hampir sama dengan metode @ Mike. Disini saya menambahkan kwargs
dan functools
membungkusnya agar lebih baik.
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)
Metode manajer konteks
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)))
Misalnya, Anda dapat menggunakannya seperti:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Dan kode di dalam with
blok akan dihitung waktunya.
Kesimpulan
Dengan menggunakan metode pertama, Anda dapat setiap hari mengomentari dekorator untuk mendapatkan kode normal. Namun, itu hanya dapat mengatur waktu suatu fungsi. Jika Anda memiliki beberapa bagian kode yang tidak dapat Anda fungsikan, maka Anda dapat memilih metode kedua.
Misalnya, sekarang Anda punya
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Sekarang Anda ingin mengatur waktu bigImage = ...
antrean. Jika Anda mengubahnya menjadi suatu fungsi, itu akan menjadi:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Kelihatannya tidak terlalu bagus ... Bagaimana jika Anda menggunakan Python 2, yang tidak memiliki nonlocal
kata kunci.
Sebaliknya, menggunakan metode kedua sangat cocok di sini:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)