Comparer les temps d’exécution de fonctions

Quelque fois on se demande qu’elle est la syntaxe la plus rapide.

Voici donc un petit script utilisant le module timit.

Il importe tous les fichiers .py du répertoire courant et exécute chaque fonction des ces derniers.

Il prend en paramètres le nombre de fois que l’on veut exécuter chaque fonction (default = 10) ainsi qu’une option pour utilser psyco.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Play all functions of modules present in current directory with timit.

    :Author: Jean-Philippe Camguilhem
    :Contact: jean-philippe.camguilhem_at_makina-corpus.org
"""
import timeit
import os
import sys

from optparse import OptionParser

unplayed = ['report.py', sys.argv[0]]

def get_modules():
    """Return all python files in current directory."""
    modules = os.listdir(os.curdir)
    return [m[:-3] for m in modules if m.endswith('.py') and m not in unplayed]

def do(s, module_name, n=1):
    """Execute function n times reloading each time the module
    """
    t = timeit.Timer(s,'import %s ; reload(%s); gc.enable()'
                     % (module_name, module_name))
    return t.timeit(n)

def play():
    """Import each module and execute each function nb times.
    """
    print '%s each function is executed %d times' % (py_version, nb)
    
    for module in get_modules():
        
        module_to_test = __import__(module)
        
        #get all module's functions
        functions = eval("[(x.__name__)" 
                         "for x in module_to_test.__dict__.values()" 
                         "if type(x).__name__ == 'function']"
                         )
        functions.sort()
        for funct in functions:
            print '%s time in sec :' % funct, do('%s.%s()' % (module, funct),
                                                 module, nb)

if __name__ == "__main__":
    
    py_version = sys.version[:5]

    parser = OptionParser()
    parser.add_option("-p", "--psyco", action="store_true",
        help="using psyco.full().")
    parser.add_option("-n", "--number", type="int", default=10,
        help="nb times each function will be played ",)
    (options, args) = parser.parse_args()

    #testing psyco option :
    if options.psyco:
        try :
            import psyco
            psyco.full()
            py_version += ' -p'
        except:
            pass

    if options.number:
        nb = options.number

    play()
Author:Jean-Philippe Camguilhem
Contact:jean-philippe.camguilhem_at_makina-corpus.org