Pengujian kecepatan Python - Perbedaan Waktu - milidetik

136

Apa cara yang tepat untuk membandingkan 2 kali dalam Python untuk mempercepat menguji bagian kode? Saya mencoba membaca dokumen API. Saya tidak yakin saya memahami hal timedelta.

Sejauh ini saya memiliki kode ini:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
BuddyJoe
sumber
15
Mengapa Anda tidak mencetak t2-t1? Apa yang menghentikan Anda dari mengurangi?
S.Lott
18
Tebak, saya memiliki momen "itu tidak mudah".
BuddyJoe

Jawaban:

191

datetime.timedelta hanya perbedaan antara dua datetimes ... jadi seperti periode waktu, dalam hari / detik / mikrodetik

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

Ketahuilah bahwa c.microsecondshanya mengembalikan bagian mikrodetik dari timedelta! Untuk tujuan waktu selalu gunakan c.total_seconds().

Anda dapat melakukan segala macam matematika dengan datetime.timedelta, misalnya:

>>> c / 10
datetime.timedelta(0, 0, 431654)

Mungkin lebih bermanfaat untuk melihat waktu CPU daripada waktu jam dinding meskipun ... itu tergantung sistem operasi ... di bawah sistem mirip Unix, lihat perintah 'waktu'.

NickZoic
sumber
Siapa pun yang tertarik untuk mendapatkan menit total dapat menggunakan int(c.total_seconds() / 60)dalam kasus ini
sufinawaz
2
The halaman untuk modul timeit mengatakan bahwa modul "menghindari sejumlah perangkap umum untuk mengukur waktu eksekusi." Apakah pendekatan ini (menggunakan datetime.now) tunduk pada salah satu dari perangkap itu?
kuzzooroo
@ Akuzzooroo ya, benar! Akan lebih baik menggunakan timeit daripada metode ini! Sebagai contoh, saya memiliki tes dalam proyek python besar itu, ketika diukur menggunakan metode ini menghasilkan runtime 0,25s seharusnya. Pada kenyataannya, dan menurut timeit, runtime dari fungsi tersebut sebenarnya adalah 30 detik!
kazaamjt
62

Karena Python 2.7 ada metode timedelta.total_seconds (). Jadi, untuk mendapatkan milidetik yang berlalu:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
fcipriani
sumber
20

Anda juga bisa menggunakan:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

Atau Anda dapat menggunakan profiler python .

Zitrax
sumber
1
Saat menggunakannya start = time.clock()mencetak 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.
Contango
16

Saya tahu ini terlambat, tetapi saya sebenarnya sangat suka menggunakan:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()memberi Anda detik sejak zaman. Karena ini adalah waktu yang terstandarisasi dalam detik, Anda dapat mengurangi waktu mulai dari waktu selesai untuk mendapatkan waktu proses (dalam detik). time.clock()bagus untuk pembandingan, tetapi saya merasa ini tidak berguna jika Anda ingin tahu berapa lama proses Anda. Misalnya, jauh lebih intuitif untuk mengatakan "proses saya membutuhkan 10 detik" daripada mengatakan "proses saya membutuhkan 10 unit jam prosesor"

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

Pada contoh pertama di atas, Anda diperlihatkan waktu 0,05 untuk time.clock () vs 0,06377 untuk time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

Dalam contoh kedua, entah bagaimana waktu prosesor menunjukkan "0" meskipun prosesnya tidur sebentar. time.time()benar menunjukkan sedikit lebih dari 1 detik.

mgoldwasser
sumber
NameError: nama 'waktu' tidak didefinisikan
Joe
Anda perlu import timepernyataan
mgoldwasser
5

Kode berikut harus menampilkan waktu yang ditentukan ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
killy971
sumber
4

Anda cukup mencetak perbedaannya:

print tend - tstart
sth
sumber
4

Saya bukan programmer Python, tapi saya tahu cara menggunakan Google dan inilah yang saya temukan: Anda menggunakan operator "-". Untuk melengkapi kode Anda:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Selain itu, sepertinya Anda dapat menggunakan fungsi strftime () untuk memformat perhitungan rentang waktu untuk membuat waktu namun membuat Anda bahagia.

Mike C.
sumber
lihat komentar kedua di tingkat pertanyaan.
BuddyJoe
15
"tetapi saya tahu cara menggunakan Google" - tampaknya, Anda tidak tahu cara menggunakan Stack Overflow, karena seluruh tujuan situs web ini adalah untuk orang-orang bertanya dan menjawab pertanyaan pemrograman dengan benar dan sampai pada titik, tidak untuk memberi keterangan tentang bagaimana "Anda bisa menggunakan Goggled".
Hejazzman
2

time.time () / datetime baik untuk penggunaan cepat, tetapi tidak selalu 100% tepat. Untuk alasan itu, saya suka menggunakan salah satu profiler std lib (terutama jagoan) untuk mencari tahu apa apa.

nilamo
sumber
2

Anda mungkin ingin melihat modul profil . Anda akan mendapatkan hasil pembacaan yang lebih baik dari tempat perlambatan Anda, dan sebagian besar pekerjaan Anda akan diotomatiskan sepenuhnya.

Stefan Kendall
sumber
2

Berikut adalah fungsi khusus yang meniru fungsi Matlab / Oktaf tic toc.

Contoh penggunaan:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

Fungsi:

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()
Ulad Kasach
sumber
Traceback (panggilan terakhir terakhir): File "redis-get-response.py", baris 22, di <module> time_var = time_me (); # dapatkan variabel dengan stempel waktu saat ini File "redis-get-response.py", baris 20, di time_me return time.time () NameError: nama 'waktu' tidak ditentukan
Joe
0

Anda bisa menggunakan timeit seperti ini untuk menguji skrip bernama module.py

$ python -mtimeit -s 'import module'
Dhiraj Thakur
sumber
0

Panah: Tanggal & waktu yang lebih baik untuk Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Eds_k
sumber