Jadi di Java, kita bisa melakukan Bagaimana mengukur waktu yang dibutuhkan oleh suatu fungsi untuk dieksekusi
Tapi bagaimana cara melakukannya dengan python? Untuk mengukur waktu mulai dan waktu akhir antar baris kode? Sesuatu yang melakukan ini:
import some_time_library
starttime = some_time_library.some_module()
code_tobe_measured()
endtime = some_time_library.some_module()
time_taken = endtime - starttime
time.clock()
, dantime.clock()
mengukur waktu CPU di Unix tetapi waktu dinding di Windows. Lebih baik digunakan ditime.time()
mana perilaku tidak berbeda dengan OS. stackoverflow.com/questions/85451/…DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
# your code here
dengantime.sleep(10)
dan mendapat 0,0 detik. Menambahkanfor i in range(10000):/pass
menghasilkan hasil yang sama. Dalam keadaan apapun saya mencoba,time.process_time()
selalu mengembalikan nomor yang sama. Saya mendapat hasil yang diharapkan menggunakantime.perf_counter()
meskipunAnda juga dapat menggunakan
time
perpustakaan:import time start = time.time() # your code # end print(f'Time: {time.time() - start}')
sumber
Dengan bantuan kelas kenyamanan kecil, Anda dapat mengukur waktu yang dihabiskan dalam garis berlekuk seperti ini:
with CodeTimer(): line_to_measure() another_line() # etc...
Yang akan menampilkan berikut ini setelah baris yang diindentasi selesai dieksekusi:
PEMBARUAN: Sekarang Anda bisa mendapatkan kelas dengan
pip install linetimer
dan kemudianfrom linetimer import CodeTimer
. Lihat proyek GitHub ini .Kode untuk kelas di atas:
import timeit class CodeTimer: def __init__(self, name=None): self.name = " '" + name + "'" if name else '' def __enter__(self): self.start = timeit.default_timer() def __exit__(self, exc_type, exc_value, traceback): self.took = (timeit.default_timer() - self.start) * 1000.0 print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
Anda kemudian dapat memberi nama blok kode yang ingin Anda ukur:
with CodeTimer('loop 1'): for i in range(100000): pass with CodeTimer('loop 2'): for i in range(100000): pass Code block 'loop 1' took: 4.991 ms Code block 'loop 2' took: 3.666 ms
Dan sarang mereka:
with CodeTimer('Outer'): for i in range(100000): pass with CodeTimer('Inner'): for i in range(100000): pass for i in range(100000): pass Code block 'Inner' took: 2.382 ms Code block 'Outer' took: 10.466 ms
Mengenai
timeit.default_timer()
, ini menggunakan timer terbaik berdasarkan versi OS dan Python, lihat jawaban ini .sumber
Saya selalu lebih suka memeriksa waktu dalam format jam, menit dan detik (% H:% M:% S):
from datetime import datetime start = datetime.now() # your code end = datetime.now() time_taken = end - start print('Time: ',time_taken)
keluaran:
Time: 0:00:00.000019
sumber
Saya sedang mencari cara bagaimana menghasilkan waktu yang diformat dengan kode minimal, jadi inilah solusi saya. Banyak orang tetap menggunakan Pandas, jadi dalam beberapa kasus hal ini dapat menghemat dari impor perpustakaan tambahan.
import pandas as pd start = pd.Timestamp.now() # code print(pd.Timestamp.now()-start)
Keluaran:
0 days 00:05:32.541600
Saya akan merekomendasikan menggunakan ini jika ketepatan waktu bukan yang paling penting, jika tidak gunakan
time
perpustakaan:%timeit pd.Timestamp.now()
keluaran 3,29 µs ± 214 ns per loop%timeit time.time()
menghasilkan 154 ns ± 13,3 ns per loopsumber
Anda juga bisa mencobanya:
from time import perf_counter t0 = perf_counter() ... t1 = perf_counter() time_taken = t1 - t0
sumber
Menempatkan kode dalam sebuah fungsi, kemudian menggunakan dekorator untuk pengaturan waktu adalah pilihan lain. ( Sumber ) Keuntungan dari metode ini adalah Anda menentukan timer sekali dan menggunakannya dengan baris tambahan sederhana untuk setiap fungsi.
Pertama, tentukan
timer
dekorator:import functools import time def timer(func): @functools.wraps(func) def wrapper(*args, **kwargs): start_time = time.perf_counter() value = func(*args, **kwargs) end_time = time.perf_counter() run_time = end_time - start_time print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3))) return value return wrapper
Kemudian, gunakan dekorator saat mendefinisikan fungsinya:
@timer def doubled_and_add(num): res = sum([i*2 for i in range(num)]) print("Result : {}".format(res))
Mari mencoba:
doubled_and_add(100000) doubled_and_add(1000000)
Keluaran:
Result : 9999900000 Finished 'doubled_and_add' in 0.0119 secs Result : 999999000000 Finished 'doubled_and_add' in 0.0897 secs
Catatan: Saya tidak yakin mengapa untuk menggunakan
time.perf_counter
bukantime.time
. Komentar diterima.sumber