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

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'.


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


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 .


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.


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

4

Anda cukup mencetak perbedaannya:

print tend - tstart

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.


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.


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.


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()

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'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.