Bagaimana mengukur waktu yang dibutuhkan antar baris kode dengan python?

98

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
alva
sumber

Jawaban:

150

Jika ingin mengukur waktu CPU, bisa menggunakan time.process_time()Python 3.3 ke atas:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

Panggilan pertama menyalakan pengatur waktu, dan panggilan kedua memberi tahu Anda berapa detik telah berlalu.

Ada juga fungsi time.clock(), tetapi tidak digunakan lagi sejak Python 3.3 dan akan dihapus dengan Python 3.8.

Ada alat pembuatan profil yang lebih baik seperti timeitdan profile, bagaimanapun time.process_time () akan mengukur waktu CPU dan inilah yang Anda tanyakan.

Jika Anda ingin mengukur waktu jam dinding, gunakan time.time().

Yevgen Yampolskiy
sumber
52
Ini bukan cara Anda menggunakan time.clock(), dan time.clock()mengukur waktu CPU di Unix tetapi waktu dinding di Windows. Lebih baik digunakan di time.time()mana perilaku tidak berbeda dengan OS. stackoverflow.com/questions/85451/…
Tim
4
Pengamatan yang bagus, @Tim. Namun posting lain pada pertanyaan yang sama mengutip python doc di time.clock () bahwa "ini adalah fungsi yang digunakan untuk benchmarking Python atau algoritma waktu". Saya kira ini mengarah ke pertanyaan tentang apa yang sebenarnya ingin Anda ukur.
Yevgen Yampolskiy
1
Hal yang sangat buruk tentang time.time () adalah bahwa hal itu dipengaruhi oleh waktu sunchronization ntpdate dll. Saya akan mengatakan time.clock () akan menjadi satu-satunya alternatif yang dapat diandalkan karena ini
www.jensolsson.se
4
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
ismailarilik
2
Hmmm ... tidak yakin apa yang saya lakukan salah. Saya mengganti # your code heredengan time.sleep(10)dan mendapat 0,0 detik. Menambahkan for i in range(10000):/passmenghasilkan hasil yang sama. Dalam keadaan apapun saya mencoba, time.process_time()selalu mengembalikan nomor yang sama. Saya mendapat hasil yang diharapkan menggunakan time.perf_counter()meskipun
biscuit314
56

Anda juga dapat menggunakan timeperpustakaan:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')
Akshaya Natarajan
sumber
1
@Hayat - Metode ini mengembalikan waktu sebagai angka floating point yang dinyatakan dalam detik sejak periode, dalam UTC. [ docs.python.org/3/library/time.html]
Anumoy Sutradhar
@AnumoySutradhar tidak juga, karena ini mengurangi epoch dari epoch, Anda mendapatkan perbedaan waktu antara dua waktu.
Nasta
28

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:

Code block took: x.xxx ms

PEMBARUAN: Sekarang Anda bisa mendapatkan kelas dengan pip install linetimerdan kemudian from 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 .

Justas
sumber
10

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
Sayali Sonawane
sumber
3

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 timeperpustakaan:

%timeit pd.Timestamp.now() keluaran 3,29 µs ± 214 ns per loop

%timeit time.time() menghasilkan 154 ns ± 13,3 ns per loop

Marius
sumber
1

Anda juga bisa mencobanya:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0
Manoj Kumar
sumber
1

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 timerdekorator:

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_counterbukan time.time. Komentar diterima.

Alperen
sumber