我正在尝试测量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()
答案 0 :(得分:5)
首先,永远不要使用时间模块来计时功能。它很容易导致错误的结论。有关示例,请参阅timeit versus timing decorator。
计算函数调用的最简单方法是使用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"
为了能够将queries
传递给raw_queries
函数调用,您必须定义queries
变量。您发布的代码queries
在phase2()
中定义,但仅限于本地。因此,要将queries
设置为全局变量,您需要执行类似phase2
返回queries
的操作:
def phase2():
...
return queries
如果您不想以这种方式弄乱phase2
,请创建一个虚拟函数:
def phase3():
# Do stuff like phase2() but return queries
return queries
答案 1 :(得分: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)
答案 2 :(得分:1)
我不确定这一点,我从未使用它,但从我读过的内容应该是这样的:
....
t = Timer("raw_queries(queries, nlp)", "from __main__ import raw_queries")
print t.timeit()
我是从http://docs.python.org/library/timeit.html取得的(如果这有帮助的话)。
答案 3 :(得分:1)
自定义计时器功能可能是一个解决方案:
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
秒。如果你想获得可靠的数字,请确保你的函数运行得足够长(不像上面的例子中那样)。
答案 4 :(得分:0)
你没有这么说,但你是否有机会试图让代码更快?如果是这样,我建议你不要专注于一个特定的例程并尝试计时。即使你得到一个数字,它也不会真正告诉你要修复什么。如果你可以在IDE下暂停几次程序并检查它的状态,包括调用堆栈,它会告诉你是什么花时间和原因。 Here is a link that gives a brief explanation of how and why it works. *
*当您点击链接时,您可能必须在上一页答案的底部。因此,在找到答案的链接时遇到了麻烦。