为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Python的timeit计时代码段以测试性能?

如何使用Python的timeit计时代码段以测试性能?

慕森王 2019-10-08 14:39:03
我有一个Python脚本,该脚本可以正常工作,但是我需要编写执行时间。我已经用谷歌搜索了,timeit但我似乎无法使其正常工作。我的Python脚本如下所示:import sysimport getoptimport timeitimport randomimport osimport reimport ibm_dbimport timefrom string import maketransmyfile = 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。目的是测试具有不同索引和调整机制的数据库更新语句。
查看完整描述

4 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

您可以在要计时的块之前或之后使用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中)不够精确,无法实现快速功能(total = 0)。在这种情况下,或者如果要平均几次运行所花费的时间,则必须多次手动调用该函数(就像我在示例代码中已经做过的那样,并且在设置其number参数时timeit会自动执行)


import time


def myfast():

   code


n = 10000

t0 = time.time()

for i in range(n): myfast()

t1 = time.time()


total_n = t1-t0

如注释中所述,在Windows中,Corey time.clock()具有更高的精度(微秒而不是秒),并且优于time.time()。


查看完整回答
反对 回复 2019-10-08
?
喵喔喔

TA贡献1735条经验 获得超5个赞

如果您要分析代码并可以使用IPython,则它具有magic函数%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


查看完整回答
反对 回复 2019-10-08
?
慕仙森

TA贡献1827条经验 获得超7个赞

除了时间之外,您显示的这段代码是完全不正确的:您执行100个连接(完全忽略除最后一个连接之外的所有连接),然后在您执行第一个执行调用时将其传递给局部变量query_stmt,该局部变量仅在执行之后初始化呼叫。


首先,使您的代码正确,而不必担心时间安排:即建立或接收连接并对该连接执行100或500或任意数量的更新的函数,然后关闭该连接。一旦您的代码正常工作,便是考虑在其上使用的正确点timeit!


具体来说,如果要计时的函数是一个无参数的函数,则foobar可以使用timeit.timeit(2.6或更高版本-在2.5及更高版本中更为复杂):


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

你最好指定运行的次数,因为默认情况下,上百万,可能是高为您的使用情况(导致该代码;-)花费了大量的时间。


查看完整回答
反对 回复 2019-10-08
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

专注于一件事。磁盘I / O速度很慢,因此如果您要调整的只是数据库查询,那么我将不进行测试。


而且,如果您需要安排数据库执行时间,请改用数据库工具,例如询问查询计划,并注意性能不仅随确切的查询和拥有的索引而变化,还随数据负载(多少数据)而变化。您已存储)。


就是说,您只需将代码放入函数中,然后使用即可运行该函数timeit.timeit():


def function_to_repeat():

    # ...


duration = timeit.timeit(function_to_repeat, number=1000)

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


您应该将设置代码移出重复功能;例如,您应该首先连接到数据库,然后仅对查询进行计时。使用setup参数导入或创建这些依赖项,并将其传递给函数:


def function_to_repeat(var1, var2):

    # ...


duration = timeit.timeit(

    'function_to_repeat(var1, var2)',

    'from __main__ import function_to_repeat, var1, var2', 

    number=1000)

会抓取globals function_to_repeat,var1并var2从您的脚本中将其每次重复传递给函数。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 1099 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信