Mam skrypt w Pythonie, który działa tak, jak powinien, ale muszę napisać czas wykonania. Wyszukałem w Google, że powinienem użyć, timeit
ale nie mogę go uruchomić.
Mój skrypt w Pythonie wygląda następująco:
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)
Potrzebuję czasu potrzebnego na wykonanie zapytania i zapisanie go w pliku results_update.txt
. Celem jest przetestowanie instrukcji aktualizacji dla mojej bazy danych z różnymi indeksami i mechanizmami dostrajania.
python
testing
timeit
database-tuning
Mestika
źródło
źródło
timeit
? Nie sądzę. W takim przypadku prawdopodobnie powinieneś usunąć z tytułu "with Pythons timeit".Odpowiedzi:
Możesz użyć
time.time()
lubtime.clock()
przed i po bloku, który chcesz czas.Ta metoda nie jest tak dokładna jak
timeit
(nie uśrednia kilku przebiegów), ale jest prosta.time.time()
(w Windows i Linux) itime.clock()
(w Linuksie) nie są wystarczająco precyzyjne dla szybkich funkcji (otrzymujesz łącznie = 0). W takim przypadku lub jeśli chcesz uśrednić czas, który upłynął przez kilka uruchomień, musisz ręcznie wywołać funkcję wiele razy (jak myślę, że już robisz w swoim przykładowym kodzie i czasie robi się to automatycznie, gdy ustawisz jego argument liczbowy )W systemie Windows, jak stwierdził Corey w komentarzu,
time.clock()
ma znacznie wyższą precyzję (mikrosekunda zamiast sekundy) i jest preferowanatime.time()
.źródło
timeit.default_timer
; Python już wykonał za Ciebie pracę. Ale tak naprawdę powinieneś używaćtimeit.timeit(myfast, number=n)
zamiast wymyślać na nowo koło powtarzalnych wywołań (i przegapić fakt, żetimeit
wyłącza moduł odśmiecania pamięci podczas wielokrotnego uruchamiania kodu).Jeśli profilujesz swój kod i możesz używać IPython, ma on magiczną funkcję
%timeit
.%%timeit
działa na komórkach.źródło
Zupełnie niezależnie od czasu, ten kod, który pokazujesz jest po prostu niepoprawny: wykonujesz 100 połączeń (całkowicie ignorując wszystkie oprócz ostatniego), a następnie, gdy wykonujesz pierwsze wywołanie wykonania, przekazujesz mu zmienną lokalną,
query_stmt
którą inicjujesz dopiero po wykonaniu połączenie.Po pierwsze, popraw kod, nie martwiąc się jeszcze o czas: tj. Funkcja, która nawiązuje lub odbiera połączenie i wykonuje 100 lub 500 lub dowolną liczbę aktualizacji na tym połączeniu, a następnie zamyka połączenie. Gdy Twój kod działa poprawnie, to właściwy punkt, w którym należy pomyśleć o jego użyciu
timeit
!W szczególności, jeśli funkcja, którą chcesz mierzyć czas, jest bez parametrów, o nazwie
foobar
, możesz użyć timeit.timeit (2.6 lub nowszy - jest bardziej skomplikowany w 2.5 i wcześniejszych):Lepiej określ liczbę uruchomień, ponieważ wartość domyślna, milion, może być wysoka dla twojego przypadku użycia (prowadząc do spędzenia dużo czasu w tym kodzie ;-).
źródło
foobar
znajduje się w pliku głównym. W ten sposób:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Skoncentruj się na jednej konkretnej rzeczy . We / wy dysku jest powolne, więc usunąłbym to z testu, jeśli wszystko, co zamierzasz ulepszyć, to zapytanie do bazy danych.
A jeśli potrzebujesz czasu na wykonanie bazy danych, poszukaj zamiast tego narzędzi bazodanowych, takich jak pytanie o plan zapytań, i zwróć uwagę, że wydajność zależy nie tylko od dokładnego zapytania i posiadanych indeksów, ale także od obciążenia danymi (ile danych zapisałeś).
To powiedziawszy, możesz po prostu umieścić swój kod w funkcji i uruchomić tę funkcję za pomocą
timeit.timeit()
:Spowoduje to wyłączenie czyszczenia pamięci, wielokrotne wywoływanie
function_to_repeat()
funkcji itimeit.default_timer()
określanie czasu całkowitego czasu trwania tych wywołań przy użyciu najdokładniejszego dostępnego zegara dla określonej platformy.Należy przenieść kod instalacyjny się z powtarzających się czynności; na przykład należy najpierw połączyć się z bazą danych, a dopiero potem mierzyć czas tylko na zapytania. Użyj
setup
argumentu, aby zaimportować lub utworzyć te zależności i przekaż je do swojej funkcji:by chwycić globalnych
function_to_repeat
,var1
avar2
od skryptu i przekazać te do funkcji każdego powtórzenia.źródło
eval
ing nie będzie latać dla niczego, co nie jest całkowicie trywialne. thxWidzę, że odpowiedź na to pytanie została już udzielona, ale nadal chcę dodać moje 2 centy za to samo.
Miałem również do czynienia z podobnym scenariuszem, w którym muszę przetestować czasy wykonywania dla kilku podejść i dlatego napisałem mały skrypt, który wywołuje timeit na wszystkich napisanych w nim funkcjach.
Skrypt jest również dostępny w formie github tutaj .
Mam nadzieję, że pomoże to Tobie i innym.
źródło
Oto proste opakowanie odpowiedzi Stevena. Ta funkcja nie wykonuje powtarzających się przebiegów / uśredniania, po prostu oszczędza Ci konieczności powtarzania kodu czasowego wszędzie :)
źródło
Pakiet testowy nie próbuje użyć importowanego,
timeit
więc trudno powiedzieć, jaki był zamiar. Niemniej jednak jest to odpowiedź kanoniczna, więc kompletny przykładtimeit
wydaje się w porządku, rozwijając odpowiedź Martijna .W docs dla
timeit
oferują wiele przykładów i flagi warto sprawdzić. Podstawowe użycie w wierszu poleceń to:Biegnij z,
-h
aby zobaczyć wszystkie opcje. Python MOTW ma świetną sekcję,timeit
która pokazuje, jak uruchamiać moduły za pomocą importu i wielowierszowych ciągów kodu z wiersza poleceń.W formie skryptu zazwyczaj używam go w następujący sposób:
Możesz dość łatwo dodać potrzebne funkcje i argumenty. Należy zachować ostrożność podczas używania nieczystych funkcji i dbać o stan.
Przykładowe dane wyjściowe:
źródło