it-swarm-tr.com

Python's time.clock () ve time.time () doğruluğu?

Python'da zamanlama için hangisi daha iyidir? time.clock () veya time.time ()? Hangisi daha fazla doğruluk sağlar?

örneğin:

start = time.clock()
... do something
elapsed = (time.clock() - start)

vs.

start = time.time()
... do something
elapsed = (time.time() - start)
410
Corey Goldberg

3.3'ten itibaren, time.clock () kullanımdan kaldırılmıştır ve zaman kullanmanız önerilir. .process_time () veya time.perf_counter () yerine.

Daha önce 2.7 'de, zaman modülü belgeleri' ye göre:

time.clock ()

Unix'te, geçerli işlemci süresini saniye cinsinden ifade kayan nokta sayısı olarak döndürün. Kesinlik ve aslında “işlemci süresi” nin anlamının tanımı, aynı ismin C işlevine bağlıdır, ancak her durumda, bu, kullanılacak işlevdir. Python veya zamanlama algoritmalarını karşılaştırmak için.

Windows'da, bu işlev, Win32 işlevine QueryPerformanceCounter () işlevini temel alarak, bu işleve ilk çağrılmasından bu yana geçen duvar saati saniye döndürür. Çözünürlük tipik olarak bir mikrosaniyeden daha iyidir.

Ek olarak, kod snippet'lerini kıyaslama için timeit modülü vardır.

147
Jason Navarrete

Kısa cevap: çoğu zaman time.clock() daha iyi olacak. Ancak, bazı donanımları (örneğin GPU’ya koyduğunuz bazı algoritmaları) zamanlarsanız, time.clock() bu süreden kurtulur ve time.time() kalan tek çözümdür.

Not: kullanılan yöntem ne olursa olsun, zamanlama kontrol edemediğiniz faktörlere bağlı olacaktır (işlem ne zaman, ne sıklıkta, ...), bu time.time() ile daha kötü, ancak time.clock() ile de var, bu yüzden asla bir zamanlama testi yapmamalısınız sadece, fakat her zaman bir dizi test uygulayın ve zamanın ortalama/varyansına bakın.

45
PierreBdR

Diğerleri cevap verdi: re: time.time() vs. time.clock().

Bununla birlikte, kıyaslama/profil oluşturma amacıyla bir kod bloğunun yürütülmesini zamanlıyorsanız, timeitmodule 'e bakınız.

25
dF.

Akılda tutulması gereken bir şey: Sistem saatini değiştirmek time.time() etkiler ancak time.clock() etkiler.

Bazı otomatik test işlemlerini kontrol etmem gerekiyordu. Test vakasının bir adımı belirli bir süreden daha uzun sürerse, bu TC bir sonrakine devam etmek için iptal edildi.

Ancak bazen sistem saatini değiştirmek için bir adım gerekli olabilir (test edilen uygulamanın programlayıcı modülünü kontrol etmek için), böylece sistem süresini gelecekte birkaç saat ayarladıktan sonra, TC zaman aşımı süresi doldu ve test durumu iptal edildi. Bunu düzgün bir şekilde yapabilmek için time.time() adresinden time.clock() işlevine geçmek zorunda kaldım.

19
Seba

clock() -> kayan nokta sayısı

İşlemin başlangıcından veya clock() adresine yapılan ilk çağrıdan beri CPU saatini veya gerçek zamanı döndürün. Bu, sistem kayıtlarında olduğu kadar hassas.

time() -> kayan nokta sayısı

Geçerli süreyi, Epoch'tan bu yana saniye cinsinden döndürün. Sistem saati bunları sağlarsa, saniyenin kesirleri mevcut olabilir.

Genellikle, time() daha doğrudur çünkü işletim sistemleri, işlemin çalışma süresini sistem saatini (yani gerçek zamanı) depoladıkları hassasiyetle saklamazlar

18
Vinko Vrsalovic

Neye önem verdiğine bağlı. DUVAR ZAMANI (duvardaki saatte olduğu gibi) demek istiyorsanız, time.clock () NO doğruluğunu sağlar çünkü CPU zamanını yönetebilir.

17
user15910

Benim için practice. time(), Linux'ta clock()'dan daha iyi bir hassasiyete sahiptir. clock() sadece 10 ms'den daha az hassasiyete sahiptir. time() mükemmel bir hassasiyet verirken. Testim CentOS 6.4 , python 2.6'da yapıldı

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms
13
bestwolf1983

Fark çok platforma özgüdür.

örneğin clock () Windows'ta Linux'tan çok farklı.

Tarif ettiğiniz örnekler için muhtemelen bunun yerine "timeit" modülünü istiyorsunuz.

6
Justin Sheehy

Unix üzerinde time.clock (), mevcut işlem tarafından kullanılmış olan CPU zamanı miktarını ölçer, bu nedenle geçen zamanı geçmişte bir noktadan ölçmek iyi değildir. Windows'ta, işleve yapılan ilk çağrıdan bu yana geçen duvar saati saniyelerini ölçer. Her iki sistemde de time.time () Epoch'tan bu yana geçen saniyeleri döndürür.

Yalnızca Windows için olan bir kod yazıyorsanız, ikisi de işe yarayacaktır (ikisini farklı kullanacak olsanız da - time.clock () için çıkarmaya gerek yoktur. Bu bir Unix sisteminde çalışacaksa veya taşınabilir olması garantili olan bir kod istiyorsanız, time.time () işlevini kullanmak isteyeceksiniz.

3
auspace

Diğerlerinin de belirttiği gibi, time.clock(), time.perf_counter() veya time.process_time() lehine kaldırılmıştır, ancak Python 3.7, time.perf_counter_ns() , time.process_time_ns() ile nanosaniye çözünürlük zamanlamasını sunar. ve time.time_ns() , diğer 3 işlevle birlikte.

Bu 6 yeni nanse çözünürlük fonksiyonu PEP 564 'de ayrıntılı olarak verilmiştir:

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

Bu işlevler, _ns son eki olmayan sürüme benzer, ancak Python int olarak birkaç nanosaniye döndürür.

Diğerlerinin de belirttiği gibi, zaman işlevlerini ve küçük kod parçacıklarını timeit modülünü kullanın.

3
Chris_Rands

Kısa cevap: Python'da zamanlama için time.clock () kullanın.

* Nix sistemlerinde clock (), işlemci süresini saniye cinsinden ifade edilen kayan nokta sayısı olarak döndürür. Windows'ta, bu işlev için ilk çağrıdan bu yana geçen süreleri kayan nokta sayısı olarak döndürür.

time (), UTC’de Epoch’tan sonraki saniye kayan nokta sayısı olarak döndürür. 1 saniye daha iyi bir hassasiyet alacağınızın garantisi yoktur (time () kayan nokta sayısını döndürse bile). Ayrıca, sistem saatinin bu işlev için iki çağrı arasında geri ayarlanmış olması durumunda, ikinci işlev çağrısının daha düşük bir değer getireceğini unutmayın.

2
Babak

2 yöntemi karşılaştırmak için bu kodu kullanıyorum. İşletim sistemim Windows 8, işlemci çekirdeği i5, RAM 4GB

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

çıktı:

süre () = 0,0993799996376

saat () = 0.0993572257367

2

Anladığım kadarıyla, time.clock () sisteminizin izin verdiği kadar hassasiyete sahiptir.

2
Jake

Doğru cevap: İkisi de aynı oranda.

Fakat subjecttime ise daha hızlı olan nedir?

Küçük bir test durum:

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

İsviçre laboratuarlarında çalışmıyorum ama test ettim ..

Bu soruya dayanarak: time.clock(), time.time() 'dan daha iyidir.

Düzenleme: time.clock() iç sayaçtır, bu nedenle dışarıda kullanılamaz, sınırlamaları vardır max 32BIT FLOAT, ilk/son değerleri saklamazsa saymaya devam edemez. Başka bir sayacı birleştiremem ...

1
dsgdfg