Tengo un script de Python que funciona como debería, pero necesito escribir el tiempo de ejecución. Busqué en Google que debería usar, timeit
pero parece que no puedo hacer que funcione.
Mi script de Python se ve así:
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)
Lo que necesito es el tiempo que lleva ejecutar la consulta y escribirla en el archivo results_update.txt
. El propósito es probar una declaración de actualización para mi base de datos con diferentes índices y mecanismos de ajuste.
python
testing
timeit
database-tuning
Mestika
fuente
fuente
timeit
? Supongo que no. En ese caso, probablemente debería eliminar "with Pythons timeit" del título.Respuestas:
Puede usar
time.time()
otime.clock()
antes y después del bloque que desea cronometrar.Este método no es tan exacto como
timeit
(no promedia varias ejecuciones) pero es sencillo.time.time()
(en Windows y Linux) ytime.clock()
(en Linux) no son lo suficientemente precisos para funciones rápidas (obtienes total = 0). En este caso o si desea promediar el tiempo transcurrido por varias ejecuciones, debe llamar manualmente a la función varias veces (como creo que ya lo hace en su código de ejemplo y el tiempo lo hace automáticamente cuando establece su argumento de número )En Windows, como Corey declaró en el comentario,
time.clock()
tiene una precisión mucho mayor (microsegundos en lugar de segundos) y se prefiere sobretime.time()
.fuente
timeit.default_timer
; Python ya ha hecho el trabajo por ti. Pero realmente, debe usar entimeit.timeit(myfast, number=n)
lugar de reinventar la rueda de llamadas repetitivas (y perder el hecho de quetimeit
deshabilita el recolector de basura mientras ejecuta el código repetidamente).Si está perfilando su código y puede usar IPython, tiene la función mágica
%timeit
.%%timeit
opera en celdas.fuente
Aparte del tiempo, este código que muestra es simplemente incorrecto: ejecuta 100 conexiones (ignorando completamente todas menos la última), y luego, cuando realiza la primera llamada de ejecución, le pasa una variable local
query_stmt
que solo inicializa después la ejecución llamada.Primero, corrija su código, sin preocuparse aún por el tiempo: es decir, una función que realiza o recibe una conexión y realiza 100 o 500 o cualquier número de actualizaciones en esa conexión, luego cierra la conexión. Una vez que tenga su código funcionando correctamente, es el punto correcto para pensar en usar
timeit
!Específicamente, si la función que desea cronometrar
foobar
se llama sin parámetros, puede usar timeit.timeit (2.6 o posterior; es más complicado en 2.5 y antes):Será mejor que especifique el número de ejecuciones porque el valor predeterminado, un millón, puede ser alto para su caso de uso (lo que lleva a pasar mucho tiempo en este código ;-).
fuente
foobar
está en un archivo principal. Así:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Concéntrese en una cosa específica . La E / S de disco es lenta, por lo que sacaría eso de la prueba si todo lo que va a modificar es la consulta de la base de datos.
Y si necesita cronometrar la ejecución de su base de datos, busque las herramientas de la base de datos, como solicitar el plan de consulta, y tenga en cuenta que el rendimiento varía no solo con la consulta exacta y qué índices tiene, sino también con la carga de datos (cuántos datos has almacenado)
Dicho esto, simplemente puede poner su código en una función y ejecutar esa función con
timeit.timeit()
:Esto deshabilitaría la recolección de basura, llamaría repetidamente a la
function_to_repeat()
función y mediría la duración total de esas llamadas usandotimeit.default_timer()
, que es el reloj disponible más preciso para su plataforma específica.Debe mover el código de configuración fuera de la función repetida; por ejemplo, primero debe conectarse a la base de datos y luego solo las consultas. Use el
setup
argumento para importar o crear esas dependencias y pasarlas a su función:tomaría los globales
function_to_repeat
,var1
yvar2
de su script y pasaría a la función cada repetición.fuente
eval
ing no va a volar para nada que no sea completamente trivial. thxVeo que la pregunta ya ha sido respondida, pero todavía quiero agregar mis 2 centavos por lo mismo.
También me he enfrentado a un escenario similar en el que tengo que probar los tiempos de ejecución para varios enfoques y, por lo tanto, escribí un pequeño script, que llama a timeit en todas las funciones escritas en él.
El script también está disponible como github gist aquí .
Espero que te ayude a ti y a los demás.
fuente
Aquí hay un contenedor simple para la respuesta de Steven. Esta función no realiza repeticiones / promedios, solo le ahorra tener que repetir el código de sincronización en todas partes :)
fuente
El conjunto de pruebas no intenta utilizar lo importado,
timeit
por lo que es difícil saber cuál fue la intención. Sin embargo, esta es una respuesta canónica, por lo que un ejemplo completotimeit
parece estar en orden, elaborando la respuesta de Martijn .Los documentos
timeit
ofrecen muchos ejemplos y banderas que vale la pena ver. El uso básico en la línea de comando es:Ejecute con
-h
para ver todas las opciones. Python MOTW tiene una gran seccióntimeit
que muestra cómo ejecutar módulos a través de cadenas de código de importación y multilínea desde la línea de comandos.En forma de script, normalmente lo uso así:
Puede colocar fácilmente las funciones y argumentos que necesita. Tenga precaución cuando use funciones impuras y cuide el estado.
Salida de muestra:
fuente
Otro ejemplo simple de timeit:
fuente