2

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()

谢谢你的帮助。

更新:我们可以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()
4

5 回答 5

6

首先,永远不要使用时间模块来计时功能。很容易得出错误的结论。有关示例,请参见timeit 与计时装饰器

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

%timeit raw_queries(queries,nlp)

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

python -mtimeit -s"import test; queries=test.phase2()" "test.raw_queries(queries)"

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

这里的成语是

python -mtimeit -s"SETUP_COMMANDS" "COMMAND_TO_BE_TIMED"

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

def phase2():
    ...
    return queries

如果您不想以phase2这种方式搞砸,请创建一个虚拟函数:

def phase3():
    # Do stuff like phase2() but return queries
    return queries
于 2009-12-27T20:13:11.753 回答
2

自定义计时器功能可能是一个解决方案:

import time

def timer(fun,*args):
    start = time.time()
    ret = fun(*args)
    end = time.time()
    return (ret, end-start)

像这样使用:

>>> from math import sin
>>> timer(sin, 0.5)
(0.47942553860420301, 6.9141387939453125e-06)

这意味着sin返回0.479...并且花了6.9e-6几秒钟。如果您想获得可靠的数字(不像上面的示例),请确保您的函数运行足够长的时间。

于 2009-12-27T19:30:58.563 回答
2

通常,您会使用timeit

例子在这里这里

另请注意:

默认情况下,timeit() 在计时期间会暂时关闭垃圾收集。这种方法的优点是它使独立时序更具可比性。这个缺点是GC可能是被测函数性能的重要组成部分

或者您可以使用time模块编写自己的自定义计时器。

如果您使用自定义计时器,请记住您应该在 windows 上使用 time.clock(),在其他平台上使用 time.time()。(timeit 内部选择)

import sys
import time

# choose timer to use
if sys.platform.startswith('win'):
    default_timer = time.clock
else:
    default_timer = time.time

start = default_timer()
# do something
finish = default_timer()
elapsed = (finish - start)
于 2009-12-27T19:48:54.177 回答
1

我不确定这一点,我从未使用过它,但从我读过的内容来看,它应该是这样的:

....
t = Timer("raw_queries(queries, nlp)", "from __main__ import raw_queries")
print t.timeit()

我从http://docs.python.org/library/timeit.html 获取了这个(如果有帮助的话)。

于 2009-12-27T19:23:46.193 回答
0

您没有这么说,但是您是否有机会尝试使代码运行得更快?如果是这样,我建议您不要专注于特定的例程并尝试对其进行计时。即使你得到一个数字,它也不会真正告诉你要修复什么。如果您可以在 IDE 下多次暂停程序并检查它的状态,包括调用堆栈,它会告诉您什么花费了时间以及为什么。这是一个链接,简要说明了它的工作方式和原因。*

*当您点击链接时,您可能需要转到上一页答案的底部。SO 在链接到答案时遇到问题。

于 2009-12-28T19:46:32.260 回答