Python hız testi - Zaman Farkı - milisaniye


136

Kodun bir bölümünü hızlı test etmek için Python'da 2 kez karşılaştırmanın doğru yolu nedir? API belgelerini okumayı denedim. Timedelta olayını anladığımdan emin değilim.

Şimdiye kadar bu koda sahibim:

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

16
T2-t1'i neden yazdırmadınız? Çıkarmaya ne engel oldu?
S. Lot

19
Tahmin et, "bu kadar kolay olamaz" anı yaşadım.
BuddyJoe

Yanıtlar:


191

datetime.timedelta sadece iki tarih zamanı arasındaki farktır ... yani gün / saniye / mikrosaniye cinsinden bir zaman dilimi gibidir

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

Unutmayın c.microsecondssadece timedelta mikrosaniyelerin kısmını döndürür! Zamanlama amacıyla her zaman kullanın c.total_seconds().

Datetime.timedelta ile her türlü matematiği yapabilirsiniz, örneğin:

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

Wallclock zamanı yerine CPU zamanına bakmak daha kullanışlı olabilir ... gerçi bu işletim sistemine bağlıdır ... Unix benzeri sistemler altında, 'zaman' komutunu kontrol edin.


Toplam dakika almak isteyen herkes int(c.total_seconds() / 60)bu durumda kullanabilir
sufinawaz

2
Sürümüyle gelen timeit modülü için sayfa modülü "yürütme sürelerini ölçmek için ortak tuzaklar bir dizi önler." Diyor Bu yaklaşım (datetime.now kullanarak) bu tuzaklardan herhangi birine tabi midir?
kuzzooroo

@kuzzooroo evet, öyle! Bu yöntem yerine timeit kullanmak daha iyi olur! Örneğin, büyük bir python projesinde, bu yöntem kullanılarak ölçüldüğünde, 0.25 saniyelik bir çalışma zamanıyla sonuçlanan bir testim var. Gerçekte ve zamana göre, söz konusu işlevin çalışma süresi aslında 30 saniyedir!
kazaamjt

62

Python 2.7'den beri timedelta.total_seconds () yöntemi var. Yani, geçen milisaniyeleri elde etmek için:

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

Ayrıca şunları da kullanabilirsiniz:

import time

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

Veya python profil oluşturucularını kullanabilirsiniz .


1
Kullanırken start = time.clock()yazdırır 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

Geç olduğunu biliyorum ama aslında şunu kullanmayı gerçekten seviyorum:

import time
start = time.time()

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

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

time.time()size çağdan beri saniye verir. Bu, saniye cinsinden standartlaştırılmış bir zaman olduğundan, işlem süresini (saniye cinsinden) elde etmek için başlangıç ​​zamanını bitiş zamanından basitçe çıkarabilirsiniz. time.clock()kıyaslama için iyidir, ancak işleminizin ne kadar sürdüğünü bilmek istiyorsanız, bunu bir nevi faydasız buldum. Örneğin, "sürecim 10 saniye sürüyor" demek, "benim sürecim 10 işlemci saat birimi alıyor" demekten çok daha sezgiseldir.

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

Yukarıdaki ilk örnekte, time.clock () için 0.05 ve time.time () için 0.06377 zamanı gösteriliyor.

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

İkinci örnekte, işlem bir saniyeliğine uyumasına rağmen işlemci zamanı bir şekilde "0" gösteriyor. time.time()1 saniyeden biraz fazla doğru şekilde gösterir.


NameError: 'zaman' adı tanımlanmadı
Joe

import timeAçıklamaya ihtiyacın var
mgoldwasser

5

Aşağıdaki kod, zaman detla ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart


4

Ben bir Python programcısı değilim, ancak Google'ı nasıl kullanacağımı biliyorum ve işte bulduğum şey: "-" operatörünü kullanıyorsunuz. Kodunuzu tamamlamak için:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Ek olarak, zamanı işlemek için zaman aralığı hesaplamasını biçimlendirmek için strftime () işlevini kullanabilirsiniz, ancak sizi mutlu eder.


soru düzeyinde ikinci yoruma bakın.
BuddyJoe

15
"ama Google'ı nasıl kullanacağımı biliyorum" - görünüşe göre Stack Overflow'u nasıl kullanacağınızı bilmiyorsunuz, çünkü bu web sitesinin tüm amacı insanların programlama sorularını doğru ve noktaya kadar sorması ve yanıtlaması değil "onun yerine Goggled'ı nasıl kullanabilirdin" konusunda kafa karıştırmak.
Hejazzman

Buraya googling yoluyla geldim :)
Jamie Cook

2

time.time () / datetime hızlı kullanım için iyidir, ancak her zaman% 100 kesin değildir. Bu nedenle, neyin ne olduğunu bulmak için std lib profilleyicilerinden birini (özellikle hotshot) kullanmayı seviyorum .


2

Profil modüllerine bakmak isteyebilirsiniz . Yavaşlamanızın nerede olduğunu daha iyi okuyacaksınız ve işinizin çoğu tam otomatik olacak.


2

İşte Matlab'ın / Octave'nin tic tocişlevlerini taklit eden özel bir işlev.

Kullanım örneği:

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

İşlev:

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

Geri izleme (en son çağrı): Dosya "redis-get-response.py", satır 22, <module> time_var = time_me (); # geçerli zaman damgasına sahip bir değişken alın Time_me dönüş zamanı içinde "redis-get-response.py" satır 20, satır 20, NameError: 'zaman' adı tanımlanmadı
Joe

0

Module.py adlı bir betiği test etmek için bunun gibi timeit kullanabilirsiniz.

$ python -mtimeit -s 'import module'

0

Arrow: Python için daha iyi tarihler ve saatler

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.