Jika Anda hanya ingin mengukur waktu jam dinding yang telah berlalu antara dua titik, Anda dapat menggunakan time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Ini memberikan waktu eksekusi dalam hitungan detik.
Opsi lain karena 3.3 mungkin untuk menggunakan perf_counter
atau process_time
, tergantung pada kebutuhan Anda. Sebelum 3.3 disarankan untuk digunakan time.clock
(terima kasih Amber ). Namun, saat ini sudah usang:
Pada Unix, kembalikan waktu prosesor saat ini sebagai angka titik mengambang yang dinyatakan dalam detik. Ketepatannya, dan pada kenyataannya, definisi sesungguhnya dari "waktu prosesor", tergantung pada fungsi C dari nama yang sama.
Pada Windows, fungsi ini mengembalikan detik jam dinding yang berlalu sejak panggilan pertama ke fungsi ini, sebagai angka titik mengambang, berdasarkan pada fungsi Win32 QueryPerformanceCounter()
. Resolusi biasanya lebih baik dari satu mikrodetik.
Sudah tidak digunakan lagi sejak versi 3.3 : Perilaku fungsi ini tergantung pada platform: gunakan perf_counter()
atau process_time()
sebaliknya , tergantung pada kebutuhan Anda, untuk memiliki perilaku yang terdefinisi dengan baik.
time.clock()
sebenarnya lebih disukai, karena tidak dapat diganggu jika jam sistem menjadi kacau, tetapi.time()
sebagian besar mencapai tujuan yang sama.)print(timedelta(seconds=execution_time))
. Padahal itu pertanyaan tersendiri.Gunakan
timeit.default_timer
sebagai gantitimeit.timeit
. Yang pertama menyediakan jam terbaik yang tersedia di platform dan versi Python Anda secara otomatis:timeit.default_timer ditugaskan ke time.time () atau time.clock () tergantung pada OS Pada Python 3.3+ default_timer adalah time.perf_counter () di semua platform. Lihat Python - time.clock () vs time.time () - akurasi?
Lihat juga:
sumber
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
modul (tidak ada pada saat jawaban) yang menyediakan antarmuka yang sama tetapi kadang-kadang membuat berbeda daritimeit
keputusan modul tentang bagaimana mengukur kinerja waktu.Hanya Python 3:
Karena time.clock () sudah tidak digunakan lagi di Python 3.3 , Anda akan ingin menggunakan
time.perf_counter()
untuk pengaturan waktu seluruh sistem, atautime.process_time()
untuk pengaturan waktu seluruh proses, persis seperti yang Anda gunakantime.clock()
:Fungsi baru
process_time
tidak akan mencakup waktu yang berlalu selama tidur.sumber
timeit.default_timer
sebagai gantitime.perf_counter
. Yang pertama akan memilih timer yang sesuai untuk mengukur kinerja waktu yang disetel untuk platform Anda dan versi Python.process_time()
tidak tidak termasuk waktu saat tidur dan oleh karena itu tidak yang sesuai untuk mengukur waktu berlalu.Diberi fungsi yang Anda inginkan waktunya,
test.py:
cara termudah untuk digunakan
timeit
adalah dengan memanggilnya dari baris perintah:Jangan mencoba menggunakan
time.time
atautime.clock
(secara naif) untuk membandingkan kecepatan fungsi. Mereka dapat memberikan hasil yang menyesatkan .PS. Jangan meletakkan pernyataan cetak dalam fungsi yang Anda inginkan; jika tidak, waktu yang diukur akan tergantung pada kecepatan terminal .
sumber
Sangat menyenangkan untuk melakukan ini dengan manajer konteks yang secara otomatis mengingat waktu mulai pada saat masuk ke
with
blok, lalu membekukan waktu akhir pada blok keluar. Dengan sedikit tipuan, Anda bahkan bisa mendapatkan penghitungan waktu yang berjalan di dalam blok dari fungsi konteks-manajer yang sama.Pustaka inti tidak memiliki ini (tapi mungkin seharusnya). Setelah berada di tempat, Anda dapat melakukan hal-hal seperti:
Berikut kode manajer konteks yang cukup untuk melakukan trik:
Dan beberapa kode demo yang dapat dijalankan:
Perhatikan bahwa dengan desain fungsi ini, nilai kembali
elapsed()
beku pada blok keluar, dan panggilan lebih lanjut mengembalikan durasi yang sama (sekitar 6 detik dalam contoh mainan ini).sumber
Mengukur waktu dalam detik:
Keluaran :
sumber
Saya lebih memilih ini.
timeit
doc terlalu membingungkan.Perhatikan, bahwa tidak ada pemformatan yang terjadi di sini, saya hanya menulis
hh:mm:ss
ke dalam cetakan sehingga orang dapat menafsirkantime_elapsed
sumber
Berikut cara lain untuk melakukan ini:
Membandingkan dengan cara tradisional:
Instalasi:
Lihat halaman PyPi untuk lebih jelasnya.
sumber
t.tic()
terkubur dalam kode, terserah saya pengembang untuk menyimpan daftar mental di mana dalam seri saya harus mengharapkan ini. Apakah Anda menemukan diri Anda membuat sarang atau hanya beberapa tictocs?ttictoc
. Cukup berantakan yang saya alami, tetapi itu harusnya baik sekarang.Berikut ini adalah temuan saya setelah melalui banyak jawaban yang baik di sini dan juga beberapa artikel lainnya.
Pertama, jika Anda berdebat antara
timeit
dantime.time
,timeit
ada dua keuntungan:timeit
pilih timer terbaik yang tersedia di OS dan versi Python Anda.timeit
menonaktifkan pengumpulan sampah, namun, ini bukan sesuatu yang Anda mungkin atau mungkin tidak inginkan.Sekarang masalahnya adalah
timeit
tidak sesederhana itu untuk digunakan karena membutuhkan pengaturan dan hal-hal menjadi jelek ketika Anda memiliki banyak impor. Idealnya, Anda hanya ingin dekorator atau menggunakanwith
blok dan mengukur waktu. Sayangnya, tidak ada built-in yang tersedia untuk ini sehingga Anda memiliki dua opsi:Opsi 1: Gunakan perpustakaan timebudget
The timebudget adalah perpustakaan serbaguna dan sangat sederhana yang dapat Anda gunakan hanya dalam satu baris kode setelah pip install.
Opsi 2: Gunakan modul kode secara langsung
Saya buat di bawah ini sedikit modul utilitas.
Sekarang Anda dapat mengatur waktu fungsi apa pun hanya dengan meletakkan dekorator di depannya:
Jika Anda ingin waktu bagian kode maka cukup taruh di dalam
with
blok:Keuntungan:
Ada beberapa versi setengah didukung yang beredar jadi saya ingin menunjukkan beberapa highlight:
with utils.MeasureBlockTime() as t
dan kemudiant.elapsed
).sumber
Menggunakan
time.time
untuk mengukur eksekusi memberi Anda waktu eksekusi keseluruhan dari perintah Anda termasuk waktu yang dihabiskan untuk proses lain di komputer Anda. Ini adalah waktu pemberitahuan pengguna, tetapi tidak baik jika Anda ingin membandingkan cuplikan kode / algoritme / fungsi / ...Informasi lebih lanjut tentang
timeit
:Jika Anda ingin wawasan yang lebih dalam tentang pembuatan profil:
Pembaruan : Saya banyak menggunakan http://pythonhosted.org/line_profiler/ selama setahun terakhir dan merasa sangat membantu dan merekomendasikan untuk menggunakannya sebagai ganti modul profil Python.
sumber
Ini adalah kelas pengatur waktu kecil yang mengembalikan string "hh: mm: ss":
Pemakaian:
sumber
Modul python cProfile dan pstats menawarkan dukungan besar untuk mengukur waktu yang berlalu dalam fungsi tertentu tanpa harus menambahkan kode apa pun di sekitar fungsi yang ada.
Misalnya jika Anda memiliki skrip python timeFunctions.py:
Untuk menjalankan profiler dan menghasilkan statistik untuk file, Anda dapat menjalankan:
Apa yang dilakukan adalah menggunakan modul cProfile untuk membuat profil semua fungsi di timeFunctions.py dan mengumpulkan statistik dalam file timeStats.profile. Perhatikan bahwa kami tidak perlu menambahkan kode apa pun ke modul yang ada (timeFunctions.py) dan ini dapat dilakukan dengan modul apa pun.
Setelah Anda memiliki file statistik, Anda dapat menjalankan modul pstats sebagai berikut:
Ini menjalankan browser statistik interaktif yang memberi Anda banyak fungsi yang bagus. Untuk kasus penggunaan khusus Anda, Anda dapat memeriksa statistik fungsi Anda. Dalam contoh kami memeriksa statistik untuk kedua fungsi menunjukkan kepada kami hal berikut:
Contoh boneka tidak banyak membantu tetapi memberi Anda gambaran tentang apa yang bisa dilakukan. Bagian terbaik tentang pendekatan ini adalah saya tidak perlu mengedit kode saya yang ada untuk mendapatkan angka-angka ini dan jelas membantu membuat profil.
sumber
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
memeriksa versi python Anda sedang berjalan. Saya mendapatkan ini ketika saya berlaripython3 -m cProfile...
danpython -m pstats
. Kesalahan saya tetapi membuat saya sejenak, jadi, saya ingin berbagidon't forget consistency
. =)Berikut manajer konteks lain untuk kode waktu -
Pemakaian:
atau, jika Anda membutuhkan nilai waktu
benchmark.py :
Diadaptasi dari http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
sumber
Gunakan modul profiler. Ini memberikan profil yang sangat rinci.
ini menghasilkan sesuatu seperti:
Saya merasa sangat informatif.
sumber
main()
? Akan lebih bermanfaat jika Anda bisa memberikan contoh kode sederhana.Saya suka itu sederhana (python 3):
Output adalah mikrodetik untuk satu eksekusi:
Penjelasan : timeit menjalankan fungsi anonim 1 juta kali secara default dan hasilnya diberikan dalam hitungan detik . Oleh karena itu hasil untuk 1 eksekusi tunggal adalah jumlah yang sama tetapi dalam mikrodetik rata-rata.
Untuk operasi yang lambat, tambahkan jumlah iterasi yang lebih rendah atau Anda bisa menunggu selamanya:
Output selalu dalam detik untuk jumlah total iterasi:
sumber
(Hanya dengan Ipython) Anda dapat menggunakan % timeit untuk mengukur waktu pemrosesan rata-rata:
lalu:
hasilnya adalah sesuatu seperti:
sumber
Satu lagi cara untuk menggunakan timeit :
sumber
di python3:
elegan dan pendek.
sumber
Agak respons yang sangat baik, tetapi mungkin itu bermanfaat bagi seseorang. Ini adalah cara untuk melakukannya yang menurut saya super bersih.
Perlu diingat bahwa "cetak" adalah fungsi dalam Python 3 dan bukan Python 2.7. Namun, ini berfungsi dengan fungsi lain. Bersulang!
sumber
Anda dapat menggunakan timeit.
Berikut adalah contoh tentang cara menguji naive_func yang mengambil parameter menggunakan Python REPL:
Anda tidak perlu fungsi pembungkus jika fungsi tidak memiliki parameter apa pun.
sumber
lambda
akan lebih ringkas:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Kita juga dapat mengubah waktu menjadi waktu yang dapat dibaca manusia.
sumber
Saya membuat perpustakaan untuk ini, jika Anda ingin mengukur suatu fungsi Anda bisa melakukannya seperti ini
https://github.com/Karlheinzniebuhr/pythonbenchmark
sumber
Untuk mendapatkan wawasan tentang setiap panggilan fungsi secara rekursif, lakukan:
Hanya membutuhkan 2 baris kode di notebook Jupyter , dan menghasilkan diagram interaktif yang bagus. Sebagai contoh:
Ini kodenya. Sekali lagi, 2 baris yang dimulai dengan
%
adalah satu-satunya baris kode tambahan yang diperlukan untuk menggunakan snakeviz:Tampaknya juga memungkinkan untuk menjalankan snakeviz di luar notebook. Info lebih lanjut di situs web snakeviz .
sumber
sumber
Pendekatan berbasis kelas yang unik ini menawarkan representasi string yang dapat dicetak, pembulatan yang dapat disesuaikan, dan akses mudah ke waktu yang telah berlalu sebagai string atau float. Ini dikembangkan dengan Python 3.7.
Pemakaian:
sumber
Mengukur waktu eksekusi snipet kode kecil.
Sumber Python Documents !
sumber
Jika Anda ingin mengatur waktu dengan nyaman, Anda dapat menggunakan dekorator sederhana:
Anda dapat menggunakannya pada fungsi yang Anda ingin waktu seperti ini:
Kemudian setiap kali Anda menelepon
function_to_time
, itu akan mencetak berapa lama dan nama fungsi yang diatur waktunya.sumber
berdasarkan pada solusi contextmanager yang diberikan oleh https://stackoverflow.com/a/30024601/5095636 , di bawah ini adalah versi gratis lambda, sebagaimana flake8 memperingatkan tentang penggunaan lambda sesuai E731 :
uji:
sumber
Cara termudah untuk menghitung durasi operasi:
sumber
Berikut adalah dekorator petunjuk yang didokumentasikan dengan cukup baik dan sepenuhnya saya gunakan sebagai utilitas umum:
Contoh penggunaan:
Dokumen dapat diperiksa dengan:
Dan tipnya mengisyaratkan:
sumber
Callable[[AnyF], AnyF]
. Apa artinya?AnyF
berartiCallable[..., Any]
, jadiAnyF
adalah fungsi yang dapat mengambil jumlah argumen jenis apa pun dan mengembalikan apa pun. JadiCallable[[AnyF], AnyF]
akan berkembang menjadiCallable[[Callable[..., Any]], Callable[..., Any]]
. Ini adalah jenis nilai pengembaliantimer
alias tipe penuhdecorator
. Ini adalah fungsi yang mengambil segala jenis fungsi sebagai satu-satunya argumen dan mengembalikan segala jenis fungsi.