有人可以从'学习Python'解释这个基准测试功能

时间:2015-08-21 08:32:33

标签: python function time

我正在学习由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)

1 个答案:

答案 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