我正在学习由Mark Lutz撰写的“学习Python”一书的python。我对这个基准测试功能有疑问。我理解前两个函数的工作原理,但我不太了解最后一个函数。有人可以向我解释最后一个函数的确切运作方式及其返回的结果吗?根据作者的说法,它是前两个功能的组合。它返回总计时间的最佳值 - 指定运行量中的最低时间,以计算调用特定函数x次的时间。我理解他的解释,但我不理解bestoftotal函数返回的元组。有人可以向我解释这个元组吗?
# File timer.py
"""
Homegrown timing tools for function calls.
Does total time, best-of time, and best-of-totals time
"""
import time, sys
try:
timer = time.perf_counter
except AttributeError:
timer = time.clock if sys.platform[:3] == 'win' else time.time
def total(reps, func, *pargs, **kargs):
"""
Total time to run func() reps times.
Returns (total time, last result)
"""
repslist = list(range(reps))
start = timer()
for i in repslist:
ret = func(*pargs, **kargs)
elapsed = timer() - start
return (elapsed, ret)
def bestof(reps, func, *pargs, **kargs):
"""
Quickest func() among reps runs.
Returns (best time, last result)
"""
best = 2 ** 32
for i in range(reps):
start = timer()
ret = func(*pargs, **kargs)
elapsed = timer() - start
if elapsed < best: best = elapsed
return (best, ret)
def bestoftotal(reps1, reps2, func, *pargs, **kargs):
"""
Best of totals:
(best of reps1 run of (total of reps2 run of func))
"""
return bestof(reps1, total, reps2, func, *pargs, **kargs)
答案 0 :(得分:0)
bestoftotal
返回对函数bestof
的调用,其中total
为func参数。
你说你理解了前两个功能,但是为了我自己的理解,让我再解释一下。
所有* pargs和** kargs都会让事情变得有些混乱。为了简化,假设我想要benchark myFunction()
,它不带任何参数。
要测量运行myFunction
10次所需的总时间,我会这样做:
total(10, myFunction)
为了测量5项试验的最佳效果(1次试验= 1次myFunction
次试验),我这样做:
bestof(5, myFunction)
现在,我想知道最好的5次试验,一次试验包括10次运行该功能(“最佳试验次数”)。
一个试验实际上是函数total(10, myFunction)
的一次运行
因此,5次试验中最好的是bestof(5, total(10,my Function))
这最后一行不是Python中的有效调用。这就是* pargs和** kwargs有用的地方
当您致电bestof(5, total, 10, myFunction)
时,调用myFunction
时会传递参数10和total
:
第ret = func(*pargs, **kargs)
行变为ret = total(10, myFunction)
。
那么bestoftotal
做了什么?好吧,它需要两个数字reps1和reps 2(在我的例子中,5和10),以及基准测试的功能。它返回对函数bestof
的调用。
bestoftotal(5, 10, myFunction)
会致电bestof(5, total, 10, myFunction)
,total(10, myFunction)
本身会拨打5次UITableView