如何使用Pythons timeit来testing代码段的性能?

我有一个python脚本,它的工作原理就像它应该但我需要写的执行时间。 我GOOGLE了,我应该使用timeit但我似乎无法得到它的工作。

我的Python脚本如下所示:

 import sys import getopt import timeit import random import os import re import ibm_db import time from string import maketrans myfile = open("results_update.txt", "a") for r in range(100): rannumber = random.randint(0, 100) update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber #print rannumber conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD") for r in range(5): print "Run %s\n" % r ibm_db.execute(query_stmt) query_stmt = ibm_db.prepare(conn, update) myfile.close() ibm_db.close(conn) 

我需要什么时间执行查询并写入文件“results_update.txt”。 目的是用不同的索引和调整机制来testing我的数据库的更新语句。

你可以在你想要的时间块的前后使用time.time或time.clock

 import time t0 = time.time() code_block t1 = time.time() total = t1-t0 

这个方法并不像timeit那么精确(它不是平均几次运行),但是它很直接。

time.time()(在windows和linux中)和time.clock(在linux中)对于快速函数没有足够的分辨率(总共= 0)。 在这种情况下,或者如果你想平均经过几次运行的时间,你必须手动调用函数多次(因为我认为你已经在你做的例子代码和时间会自动设置其数字参数)

 import time def myfast(): code n = 10000 t0 = time.time() for i in range(n): myfast() t1 = time.time() total_n = t1-t0 

正如Corey在评论中所说的那样,time.clock()具有更高的精度(微秒而不是秒),并且必须优先于time.time()。

除了时间之外,你显示的代码是不正确的:你执行100个连接(完全忽略除最后一个以外的所有连接),然后当你执行第一次执行调用时,将一个局部variablesquery_stmt传递给执行呼叫。

首先,让你的代码正确,而不必担心时间安排问题:例如,一个函数可以build立或者接收一个连接,然后在这个连接上执行100或者500或者任意数量的更新,然后closures连接。 一旦你的代码正确工作,正确的点在timeit考虑使用timeit

具体来说,如果你想要的时间函数是一个没有参数的函数,那么可以使用timeit.timeit (2.6或更高版本 – 它在2.5和之前更复杂):

 timeit.timeit('foobar()', number=1000) 

你最好指定运行次数,因为你的用例的默认值,一百万,可能会很高(导致花费大量的时间在这个代码;-)。

如果你正在分析你的代码,并可以使用IPython,它具有神奇的function%timeit

%%timeit在单元上运行。

 In [2]: %timeit cos(3.14) 10000000 loops, best of 3: 160 ns per loop In [3]: %%timeit ...: cos(3.14) ...: x = 2 + 3 ...: 10000000 loops, best of 3: 196 ns per loop 

专注于一个具体的事情 。 磁盘I / O速度很慢,所以如果你要调整数据库查询的话,我会把它从testing中解脱出来。

如果您需要定时执行数据库,则需要查找数据库工具,例如查询查询计划,并注意性能不仅因查询的准确性和您拥有的索引而异,而且与数据负载(数据量有多less你已经存储)。

这就是说,你可以简单地把你的代码放在一个函数中,并用timeit.timeit()运行该函数:

 def function_to_repeat(): # ... duration = timeit.timeit(function_to_repeat, number=1000) 

这将禁用垃圾收集,重复调用function_to_repeat()函数,并使用timeit.default_timer()函数计算这些调用的总持续时间, timeit.default_timer()是您的特定平台最准确的时钟。

您应该将设置代码移出重复function; 例如,您应该首先连接到数据库,然后仅查询查询。 使用setup参数来导入或创build这些依赖关系,并将它们传递给你的函数:

 def function_to_repeat(var1, var2): # ... duration = timeit.timeit( 'function_to_repeat(var1, var2)', 'from __main__ import function_to_repeat, var1, var2', number=1000) 

会从脚本中获取全局function_to_repeatvar1var2 ,并将其每次重复传递给函数。

我看到这个问题已经被回答了,但是还是要加我的2分钱。

我也面临类似的情况,我必须testing几种方法的执行时间,因此写了一个小脚本,它调用写在其中的所有函数的timeit。

脚本也可以作为github的要点在这里 。

希望它会帮助你和其他人。

 from random import random import types def list_without_comprehension(): l = [] for i in xrange(1000): l.append(int(random()*100 % 100)) return l def list_with_comprehension(): # 1K random numbers between 0 to 100 l = [int(random()*100 % 100) for _ in xrange(1000)] return l # operations on list_without_comprehension def sort_list_without_comprehension(): list_without_comprehension().sort() def reverse_sort_list_without_comprehension(): list_without_comprehension().sort(reverse=True) def sorted_list_without_comprehension(): sorted(list_without_comprehension()) # operations on list_with_comprehension def sort_list_with_comprehension(): list_with_comprehension().sort() def reverse_sort_list_with_comprehension(): list_with_comprehension().sort(reverse=True) def sorted_list_with_comprehension(): sorted(list_with_comprehension()) def main(): objs = globals() funcs = [] f = open("timeit_demo.sh", "w+") for objname in objs: if objname != 'main' and type(objs[objname]) == types.FunctionType: funcs.append(objname) funcs.sort() for func in funcs: f.write('''echo "Timing: %(funcname)s" python -m timeit "import timeit_demo; timeit_demo.%(funcname)s();"\n\n echo "------------------------------------------------------------" ''' % dict( funcname = func, ) ) f.close() if __name__ == "__main__": main() from os import system #Works only for *nix platforms system("/bin/bash timeit_demo.sh") #un-comment below for windows #system("cmd timeit_demo.sh")