如何使用Pythons timeit来计时用于测试性能的代码段?

2024-04-26 06:51:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,它可以正常工作,但是我需要编写执行时间。我在google上搜索到应该使用^{},但似乎无法让它工作。

我的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所需的时间。目的是使用不同的索引和优化机制测试数据库的update语句。


Tags: inimporttxt脚本fordb时间update
3条回答

您可以在要计时的块前后使用^{}^{}

import time

t0 = time.time()
code_block
t1 = time.time()

total = t1-t0

这个方法不像^{}那样精确(它不平均几次运行),但它很简单。

time.time()(在Windows和Linux中)和time.clock()(在Linux中)对于快速函数来说不够精确(得到total=0)。在这种情况下,或者如果希望平均几次运行所花费的时间,则必须手动多次调用该函数(正如我在示例代码中所做的那样,当设置其number参数时,该函数将自动执行)

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

如果您正在分析代码并可以使用IPython,那么它具有神奇的功能%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

除了计时之外,您显示的这段代码完全不正确:您执行100个连接(完全忽略除最后一个以外的所有连接),然后当您执行第一个execute调用时,向它传递一个局部变量query_stmt,您只在执行调用之后初始化它。

首先,让你的代码正确无误,无需担心时间:即一个函数,它建立或接收一个连接,并对该连接执行100或500次或任何数量的更新,然后关闭该连接。一旦您的代码工作正常,就是考虑在其上使用timeit的正确点!

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

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

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

相关问题 更多 >