pythontestingtimeitdatabase-tuning

How can I time a code segment for testing performance with Pythons timeit?


I've a python script which works just as it should, but I need to write the execution time. I've googled that I should use timeit but I can't seem to get it to work.

My Python script looks like this:

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)

What I need is the time it takes to execute the query and write it to the file results_update.txt. The purpose is to test an update statement for my database with different indexes and tuning mechanisms.


Solution

  • You can use time.time() or time.clock() before and after the block you want to time.

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

    This method is not as exact as timeit (it does not average several runs) but it is straightforward.

    time.time() (in Windows and Linux) and time.clock() (in Linux) are not precise enough for fast functions (you get total = 0). In this case or if you want to average the time elapsed by several runs, you have to manually call the function multiple times (As I think you already do in you example code and timeit does automatically when you set its number argument)

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

    In Windows, as Corey stated in the comment, time.clock() has much higher precision (microsecond instead of second) and is preferred over time.time().