J'ai un script python qui fonctionne comme il se doit, mais j'ai besoin d'écrire l'heure d'exécution. J'ai cherché sur Google que je devrais utiliser timeit
mais je n'arrive pas à le faire fonctionner.
Mon script Python ressemble à ceci:
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)
Ce dont j'ai besoin, c'est du temps nécessaire pour exécuter la requête et l'écrire dans le fichier results_update.txt
. Le but est de tester une instruction de mise à jour pour ma base de données avec différents index et mécanismes de réglage.
python
testing
timeit
database-tuning
Mestika
la source
la source
timeit
? Je suppose que non. Dans ce cas, vous devriez probablement supprimer "with Pythons timeit" du titre.Réponses:
Vous pouvez utiliser
time.time()
outime.clock()
avant et après le bloc que vous souhaitez chronométrer.Cette méthode n'est pas aussi exacte que
timeit
(elle ne fait pas la moyenne de plusieurs passages) mais elle est simple.time.time()
(sous Windows et Linux) ettime.clock()
(sous Linux) ne sont pas assez précis pour les fonctions rapides (vous obtenez total = 0). Dans ce cas ou si vous voulez faire la moyenne du temps écoulé par plusieurs exécutions, vous devez appeler manuellement la fonction plusieurs fois (comme je pense que vous le faites déjà dans votre exemple de code et timeit le fait automatiquement lorsque vous définissez son argument numérique )Dans Windows, comme Corey l'a déclaré dans le commentaire,
time.clock()
a une précision beaucoup plus élevée (microseconde au lieu de seconde) et est préférable àtime.time()
.la source
timeit.default_timer
; Python a déjà fait le travail pour vous. Mais vraiment, vous devriez utilisertimeit.timeit(myfast, number=n)
au lieu de réinventer la roue des appels répétitifs (et manquer le fait quitimeit
désactive le ramasse-miettes lors de l'exécution répétée du code).Si vous profilez votre code et pouvez utiliser IPython, il a la fonction magique
%timeit
.%%timeit
fonctionne sur les cellules.la source
Indépendamment du timing, ce code que vous affichez est tout simplement incorrect: vous exécutez 100 connexions (en ignorant complètement tout sauf la dernière), puis lorsque vous effectuez le premier appel d'exécution, vous lui transmettez une variable locale
query_stmt
que vous n'initialisez qu'après l'exécution. appel.Tout d'abord, corrigez votre code, sans vous soucier encore du timing: c'est-à-dire une fonction qui établit ou reçoit une connexion et effectue 100 ou 500 ou n'importe quel nombre de mises à jour sur cette connexion, puis ferme la connexion. Une fois que votre code fonctionne correctement, c'est le bon moment pour penser à l'utiliser
timeit
!Plus précisément, si la fonction que vous souhaitez chronométrer est une fonction appelée sans paramètre,
foobar
vous pouvez utiliser timeit.timeit (2.6 ou version ultérieure - c'est plus compliqué en 2.5 et avant):Vous feriez mieux de spécifier le nombre d'exécutions car la valeur par défaut, un million, peut être élevée pour votre cas d'utilisation (ce qui conduit à passer beaucoup de temps dans ce code ;-).
la source
foobar
est dans un fichier principal. Comme ça:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Concentrez-vous sur une chose spécifique . Les E / S de disque sont lentes, je retirerais donc cela du test si tout ce que vous voulez modifier est la requête de base de données.
Et si vous avez besoin de chronométrer l'exécution de votre base de données, recherchez plutôt des outils de base de données, comme demander le plan de requête, et notez que les performances varient non seulement en fonction de la requête exacte et des index dont vous disposez, mais également en fonction de la charge de données (combien de données vous avez stocké).
Cela dit, vous pouvez simplement mettre votre code dans une fonction et exécuter cette fonction avec
timeit.timeit()
:Cela désactiverait le garbage collection, appellerait à plusieurs reprises la
function_to_repeat()
fonction et chronométrerait la durée totale de ces appels en utilisanttimeit.default_timer()
, qui est l'horloge disponible la plus précise pour votre plate-forme spécifique.Vous devez déplacer le code de configuration hors de la fonction répétée; par exemple, vous devez d'abord vous connecter à la base de données, puis chronométrer uniquement les requêtes. Utilisez l'
setup
argument pour importer ou créer ces dépendances, puis passez-les dans votre fonction:saisirait les globaux
function_to_repeat
,var1
et àvar2
partir de votre script et les passerait à la fonction chaque répétition.la source
eval
ne va pas voler pour quelque chose qui n'est pas complètement banal. thxJe vois que la question a déjà été répondue, mais je veux toujours ajouter mes 2 cents pour la même chose.
J'ai également fait face à un scénario similaire dans lequel je dois tester les temps d'exécution pour plusieurs approches et donc écrire un petit script, qui appelle timeit sur toutes les fonctions qui y sont écrites.
Le script est également disponible en tant que github gist ici .
J'espère que cela vous aidera, vous et les autres.
la source
Voici un emballage simple pour la réponse de Steven. Cette fonction ne fait pas d'exécutions / moyennes répétées, vous évite simplement d'avoir à répéter le code de synchronisation partout :)
la source
La suite de tests ne tente pas d'utiliser le fichier importé
timeit
, il est donc difficile de dire quelle était l'intention. Néanmoins, c'est une réponse canonique, donc un exemple complet detimeit
semble en ordre, élaborant sur la réponse de Martijn .Les documents pour
timeit
offrent de nombreux exemples et indicateurs à vérifier. L'utilisation de base sur la ligne de commande est:Exécutez avec
-h
pour voir toutes les options. Python MOTW a une grande section surtimeit
qui montre comment exécuter des modules via l'importation et des chaînes de code multilignes à partir de la ligne de commande.Sous forme de script, je l'utilise généralement comme ceci:
Vous pouvez facilement supprimer les fonctions et les arguments dont vous avez besoin. Soyez prudent lorsque vous utilisez des fonctions impures et faites attention à l'état.
Exemple de sortie:
la source
Un autre exemple simple de timeit:
la source