หลังจากเล่นกับ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)
ดูไม่ค่อยดีนัก ... จะเป็นอย่างไรถ้าคุณอยู่ใน Python 2 ซึ่งไม่มีnonlocal
คีย์เวิร์ด
แทนที่จะใช้วิธีที่สองเหมาะกับที่นี่มาก:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)