使用Python中的参数测量函数的时间

Dim*_*eas 2 python performance time arguments timeit

我试图测量raw_queries(...)到目前为止的失败时间.我发现我应该使用timeit模块.问题是我不能(=我不知道如何)从环境中将参数传递给函数.

重要说明:在调用之前raw_queries,我们必须执行phase2()(环境初始化).

旁注:代码在Python 3中.

def raw_queries(queries, nlp):
    """ Submit queries without getting visual response """

    for q in queries:
        nlp.query(q)

def evaluate_queries(queries, nlp):
    """ Measure the time that the queries need to return their results """

    t = Timer("raw_queries(queries, nlp)", "?????")
    print(t.timeit())

def phase2():
    """ Load dictionary to memory and subsequently submit queries """

    # prepare Linguistic Processor to submit it the queries
    all_files = get_files()
    b = LinguisticProcessor(all_files)
    b.loadDictionary()

    # load the queries
    queries_file = 'queries.txt'
    queries = load_queries(queries_file)

if __name__ == '__main__':
    phase2()
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

更新:我们可以phase2()使用第二个参数调用Timer.问题是我们需要(queries, nlp)来自环境的参数.

更新:到目前为止最好的解决方案,unutbu的帮助(只有改变了):

def evaluate_queries():
    """ Measure the time that the queries need to return their results """

    t = Timer("main.raw_queries(queries, nlp)", "import main;\
        (queries,nlp)=main.phase2()")

    sf = 'Execution time: {} ms'
    print(sf.format(t.timeit(number=1000)))


def phase2():
    ...

    return queries, b


def main():
    evaluate_queries()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 6

首先,永远不要使用时间模块来计时功能.它很容易导致错误的结论.有关示例,请参阅timeit与timing decorator.

计时函数调用的最简单方法是使用IPython的%timeit命令.在那里,您只需启动一个交互式IPython会话,调用phase2(),定义queries,然后运行

%timeit raw_queries(queries,nlp)
Run Code Online (Sandbox Code Playgroud)

我知道使用timeit的第二个最简单的方法是从命令行调用它:

python -mtimeit -s"import test; queries=test.phase2()" "test.raw_queries(queries)"
Run Code Online (Sandbox Code Playgroud)

(在上面的命令中,我假设脚本被调用test.py)

这里的成语是

python -mtimeit -s"SETUP_COMMANDS" "COMMAND_TO_BE_TIMED"
Run Code Online (Sandbox Code Playgroud)

为了能够传递queriesraw_queries函数调用,您必须定义queries变量.您发布的代码queries是在phase2()本地定义的,但仅限于本地.因此,要设置queries为全局变量,您需要执行类似phase2返回的操作queries:

def phase2():
    ...
    return queries
Run Code Online (Sandbox Code Playgroud)

如果您不想这样搞乱phase2,请创建一个虚拟函数:

def phase3():
    # Do stuff like phase2() but return queries
    return queries
Run Code Online (Sandbox Code Playgroud)