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

我有一个Python脚本,该脚本可以正常工作,但是我需要编写执行时间。我已经用谷歌搜索了,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。目的是测试具有不同索引和调整机制的数据库更新语句。


慕森王
浏览 1101回答 4
4回答

紫衣仙女

您可以在要计时的块之前或之后使用time.time()或time.clock()。import timet0 = time.time()code_blockt1 = time.time()total = t1-t0此方法不完全精确timeit(它不会平均运行几次),但是很简单。time.time()(在Windows和Linux中)和time.clock()(在Linux中)不够精确,无法实现快速功能(total = 0)。在这种情况下,或者如果要平均几次运行所花费的时间,则必须多次手动调用该函数(就像我在示例代码中已经做过的那样,并且在设置其number参数时timeit会自动执行)import timedef myfast():&nbsp; &nbsp;coden = 10000t0 = time.time()for i in range(n): myfast()t1 = time.time()total_n = t1-t0如注释中所述,在Windows中,Corey time.clock()具有更高的精度(微秒而不是秒),并且优于time.time()。

喵喔喔

如果您要分析代码并可以使用IPython,则它具有magic函数%timeit。%%timeit 对细胞进行操作。In [2]: %timeit cos(3.14)10000000 loops, best of 3: 160 ns per loopIn [3]: %%timeit&nbsp; &nbsp;...: cos(3.14)&nbsp; &nbsp;...: x = 2 + 3&nbsp; &nbsp;...:&nbsp;10000000 loops, best of 3: 196 ns per loop

慕仙森

除了时间之外,您显示的这段代码是完全不正确的:您执行100个连接(完全忽略除最后一个连接之外的所有连接),然后在您执行第一个执行调用时将其传递给局部变量query_stmt,该局部变量仅在执行之后初始化呼叫。首先,使您的代码正确,而不必担心时间安排:即建立或接收连接并对该连接执行100或500或任意数量的更新的函数,然后关闭该连接。一旦您的代码正常工作,便是考虑在其上使用的正确点timeit!具体来说,如果要计时的函数是一个无参数的函数,则foobar可以使用timeit.timeit(2.6或更高版本-在2.5及更高版本中更为复杂):timeit.timeit('foobar()', number=1000)你最好指定运行的次数,因为默认情况下,上百万,可能是高为您的使用情况(导致该代码;-)花费了大量的时间。

MMMHUHU

专注于一件事。磁盘I / O速度很慢,因此如果您要调整的只是数据库查询,那么我将不进行测试。而且,如果您需要安排数据库执行时间,请改用数据库工具,例如询问查询计划,并注意性能不仅随确切的查询和拥有的索引而变化,还随数据负载(多少数据)而变化。您已存储)。就是说,您只需将代码放入函数中,然后使用即可运行该函数timeit.timeit():def function_to_repeat():&nbsp; &nbsp; # ...duration = timeit.timeit(function_to_repeat, number=1000)这将禁用垃圾收集,重复调用该function_to_repeat()函数,并使用来计时这些调用的总持续时间timeit.default_timer(),这是您特定平台上最准确的可用时钟。您应该将设置代码移出重复功能;例如,您应该首先连接到数据库,然后仅对查询进行计时。使用setup参数导入或创建这些依赖项,并将其传递给函数:def function_to_repeat(var1, var2):&nbsp; &nbsp; # ...duration = timeit.timeit(&nbsp; &nbsp; 'function_to_repeat(var1, var2)',&nbsp; &nbsp; 'from __main__ import function_to_repeat, var1, var2',&nbsp;&nbsp; &nbsp; number=1000)会抓取globals function_to_repeat,var1并var2从您的脚本中将其每次重复传递给函数。
打开App,查看更多内容
随时随地看视频慕课网APP