Saya ingin membuat fungsi python untuk menguji waktu yang dihabiskan di setiap fungsi dan mencetak namanya dengan waktunya, bagaimana saya bisa mencetak nama fungsi dan jika ada cara lain untuk melakukannya tolong beri tahu saya
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
untuk mengukur. Ini tidak sempurna, tetapi jauh lebih baiktimeit
daripada tusukan Anda dan jauh lebih mudah digunakan daripada membuat sendiri sesuatu yang lebih baik.Jawaban:
Pertama dan terpenting, saya sangat menyarankan menggunakan profiler atau waktu penggunaan setidaknya .
Namun jika Anda ingin menulis metode pengaturan waktu Anda sendiri hanya untuk belajar, berikut adalah tempat untuk mulai menggunakan dekorator.
Python 2:
Dan penggunaannya sangat sederhana, cukup gunakan dekorator @timing:
Python 3:
Catatan Saya menelepon
f.func_name
untuk mendapatkan nama fungsi sebagai string (dengan Python 2), atauf.__name__
di Python 3.sumber
Setelah bermain dengan
timeit
modul, saya tidak suka antarmukanya, yang tidak begitu elegan dibandingkan dengan dua metode berikut.Kode berikut ada di Python 3.
Metode dekorator
Ini hampir sama dengan metode @ Mike. Disini saya menambahkan
kwargs
danfunctools
membungkusnya agar lebih baik.Metode manajer konteks
Misalnya, Anda dapat menggunakannya seperti:
Dan kode di dalam
with
blok akan dihitung waktunya.Kesimpulan
Dengan menggunakan metode pertama, Anda dapat setiap hari mengomentari dekorator untuk mendapatkan kode normal. Namun, itu hanya dapat mengatur waktu suatu fungsi. Jika Anda memiliki beberapa bagian kode yang tidak dapat Anda fungsikan, maka Anda dapat memilih metode kedua.
Misalnya, sekarang Anda punya
Sekarang Anda ingin mengatur waktu
bigImage = ...
antrean. Jika Anda mengubahnya menjadi suatu fungsi, itu akan menjadi:Kelihatannya tidak terlalu bagus ... Bagaimana jika Anda menggunakan Python 2, yang tidak memiliki
nonlocal
kata kunci.Sebaliknya, menggunakan metode kedua sangat cocok di sini:
sumber
timeit
antarmuka dan menggunakanwraps()
fungsifunctools
modul. Maksud saya semua kode tambahan itu tidak diperlukan.import functools
Saya tidak melihat apa masalahnya dengan
timeit
modul tersebut. Ini mungkin cara paling sederhana untuk melakukannya.Ini juga memungkinkan untuk mengirim argumen ke fungsi. Yang Anda butuhkan hanyalah menyelesaikan fungsi Anda menggunakan dekorator. Penjelasan lebih lanjut di sini: http://www.pythoncentral.io/time-a-python-function/
Satu-satunya kasus di mana Anda mungkin tertarik untuk menulis pernyataan waktu Anda sendiri adalah jika Anda ingin menjalankan fungsi hanya sekali dan juga ingin mendapatkan nilai kembaliannya.
Keuntungan menggunakan
timeit
modul ini adalah memungkinkan Anda mengulangi jumlah eksekusi. Ini mungkin diperlukan karena proses lain mungkin mengganggu keakuratan waktu Anda. Jadi, Anda harus menjalankannya beberapa kali dan melihat nilai terendahnya.sumber
timeit.timeit(lambda: func(a,b,c), number=1)
? Saya menggunakan ini saat melakukan pengujian pada solusi hipotetis di terminal.Timeit memiliki dua kelemahan besar: ia tidak mengembalikan nilai kembali dari fungsi tersebut, dan ia menggunakan eval, yang mengharuskan diteruskannya kode pengaturan tambahan untuk impor. Ini menyelesaikan kedua masalah dengan sederhana dan elegan:
sumber
Ada alat yang mudah untuk mengatur waktu. https://github.com/RalphMao/PyTimer
Ini bisa bekerja seperti dekorator :
Keluaran:
Ini juga dapat bekerja seperti pengatur waktu plug-in dengan kontrol namespace (berguna jika Anda memasukkannya ke fungsi yang memiliki banyak kode dan dapat dipanggil di mana saja).
Keluaran:
Semoga bisa membantu
sumber
Metode dekorator menggunakan pustaka Python dekorator:
Lihat posting di Blog saya:
posting di Blog mobilepro.pl
posting saya di Google Plus
sumber
Cara saya melakukannya:
Tetapkan variabel seperti
start = time()
sebelum menjalankan fungsi / loop, danprintTime(start)
tepat setelah blok.dan Anda mendapat jawabannya.
sumber