Saya memiliki skrip python yang berfungsi seperti seharusnya, tetapi saya harus menulis waktu eksekusi. Saya sudah googled bahwa saya harus menggunakan timeit
tetapi sepertinya saya tidak bisa membuatnya bekerja.
Skrip Python saya terlihat seperti ini:
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)
Yang saya butuhkan adalah waktu yang diperlukan untuk menjalankan kueri dan menulisnya ke file results_update.txt
. Tujuannya adalah untuk menguji pernyataan pembaruan untuk basis data saya dengan berbagai indeks dan mekanisme penyetelan.
python
testing
timeit
database-tuning
Mestika
sumber
sumber
timeit
? Saya rasa tidak. Dalam hal ini, Anda mungkin harus menghapus "with Pythons timeit" dari judul.Jawaban:
Anda dapat menggunakan
time.time()
atautime.clock()
sebelum dan sesudah blok yang Anda inginkan.Metode ini tidak setepat
timeit
(tidak rata-rata beberapa kali berjalan) tetapi langsung.time.time()
(di Windows dan Linux) dantime.clock()
(di Linux) tidak cukup tepat untuk fungsi cepat (Anda mendapatkan total = 0). Dalam hal ini atau jika Anda ingin rata-rata waktu berlalu oleh beberapa berjalan, Anda harus secara manual memanggil fungsi beberapa kali (Seperti saya pikir Anda sudah melakukannya dalam kode contoh Anda dan timeit tidak secara otomatis ketika Anda mengatur argumen nomornya )Di Windows, seperti yang dinyatakan Corey dalam komentar,
time.clock()
memiliki presisi yang jauh lebih tinggi (mikrodetik, bukan yang kedua) dan lebih disukaitime.time()
.sumber
timeit.default_timer
; Python telah melakukan pekerjaan untuk Anda. Tapi sungguh, Anda harus menggunakantimeit.timeit(myfast, number=n)
alih-alih menciptakan kembali roda panggilan berulang (dan kehilangan fakta bahwatimeit
menonaktifkan pengumpul sampah saat menjalankan kode berulang kali).Jika Anda membuat profil kode Anda dan dapat menggunakan IPython, ia memiliki fungsi ajaib
%timeit
.%%timeit
beroperasi pada sel.sumber
Terlepas dari timingnya, kode yang Anda perlihatkan ini benar-benar salah: Anda mengeksekusi 100 koneksi (sama sekali mengabaikan semua kecuali yang terakhir), dan kemudian ketika Anda melakukan panggilan eksekusi pertama Anda memberikannya variabel lokal
query_stmt
yang baru Anda inisialisasi setelah eksekusi panggilan.Pertama, buat kode Anda benar, tanpa khawatir tentang waktu: yaitu fungsi yang membuat atau menerima koneksi dan melakukan 100 atau 500 atau berapa pun jumlah pembaruan pada koneksi itu, kemudian menutup koneksi. Setelah kode Anda berfungsi dengan benar adalah titik yang tepat untuk memikirkan menggunakannya
timeit
!Secara khusus, jika fungsi yang Anda inginkan adalah parameter-kurang yang dipanggil,
foobar
Anda dapat menggunakan timeit.timeit (2.6 atau lebih baru - ini lebih rumit pada 2.5 dan sebelumnya):Anda sebaiknya menentukan jumlah proses karena default, satu juta, mungkin tinggi untuk kasus penggunaan Anda (menyebabkan menghabiskan banyak waktu dalam kode ini ;-).
sumber
foobar
ada di file utama. Seperti ini:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Fokus pada satu hal spesifik . Disk I / O lambat, jadi saya akan mengambil dari tes jika semua yang akan Anda tweak adalah query database.
Dan jika Anda perlu menghitung waktu pelaksanaan basis data Anda, cari alat basis data sebagai gantinya, seperti menanyakan rencana kueri, dan perhatikan bahwa kinerjanya bervariasi tidak hanya dengan kueri yang tepat dan indeks apa yang Anda miliki, tetapi juga dengan beban data (berapa banyak data Anda telah menyimpan).
Yang mengatakan, Anda cukup meletakkan kode Anda dalam suatu fungsi dan menjalankan fungsi itu dengan
timeit.timeit()
:Ini akan menonaktifkan pengumpulan sampah, berulang kali memanggil
function_to_repeat()
fungsi, dan menentukan waktu total durasi panggilan yang digunakantimeit.default_timer()
, yang merupakan jam paling akurat yang tersedia untuk platform spesifik Anda.Anda harus pindah kode setup keluar dari fungsi diulang; misalnya, Anda harus terhubung ke database terlebih dahulu, lalu hanya waktu kueri. Gunakan
setup
argumen untuk mengimpor atau membuat dependensi tersebut, dan meneruskannya ke fungsi Anda:akan mengambil global
function_to_repeat
,var1
danvar2
dari skrip Anda dan meneruskannya ke fungsi setiap pengulangan.sumber
eval
ing tidak akan terbang untuk apa pun yang tidak sepenuhnya sepele. thxSaya melihat pertanyaan sudah dijawab, tetapi masih ingin menambahkan 2 sen saya untuk hal yang sama.
Saya juga menghadapi skenario serupa di mana saya harus menguji waktu pelaksanaan untuk beberapa pendekatan dan karenanya menulis skrip kecil, yang memanggil timeit pada semua fungsi yang ditulis di dalamnya.
Script ini juga tersedia sebagai github intisari di sini .
Semoga ini akan membantu Anda dan orang lain.
sumber
Inilah pembungkus sederhana untuk jawaban steven. Fungsi ini tidak menjalankan berulang / rata-rata, hanya menyelamatkan Anda dari keharusan mengulang kode waktu di mana-mana :)
sumber
Suite pengujian tidak berupaya menggunakan impor
timeit
sehingga sulit untuk mengatakan apa maksudnya. Meskipun demikian, ini adalah jawaban kanonik sehingga contoh lengkap daritimeit
urutan tampaknya, menguraikan jawaban Martijn .The docs untuk
timeit
menawarkan banyak contoh dan bendera senilai check-out. Penggunaan dasar pada baris perintah adalah:Jalankan dengan
-h
untuk melihat semua opsi. Python MOTW memiliki bagian hebattimeit
yang menunjukkan cara menjalankan modul melalui impor dan string kode multiline dari baris perintah.Dalam bentuk skrip, saya biasanya menggunakannya seperti ini:
Anda dapat dengan mudah menjatuhkan fungsi dan argumen yang Anda butuhkan. Berhati-hatilah saat menggunakan fungsi yang tidak murni dan jaga keadaan.
Output sampel:
sumber
Contoh timeit sederhana lainnya:
sumber