Python'un time.clock () ile time.time () karşılaştırması?


428

Python'da zamanlama için hangisi daha iyi? 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)

32
Python 3.3 itibariyle time.clock(), kullanımının kullanımdan kaldırıldığını ve bunun yerine perf_counter()veya process_time()kullanılması önerilir .
Cody Piersall


Bir işlem tarafından kullanılan tüm çekirdeklerin nasıl toplandığı ve alt süreçlerin nasıl toplanmadığı hakkındaki bu yoruma bakın . Ayrıca bu hassasiyet tartışmasına bakın (tabii ki sisteme göre değişir). time.clocktime.process_time
maksimum

Yanıtlar:


161

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

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

zaman saati()

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

Windows'da, bu işlev, QueryPerformanceCounter () Win32 işlevini temel alarak, kayan nokta sayısı olarak, bu işleve yapılan ilk çağrıdan bu yana geçen duvar saati saniye değerini döndürür. Çözünürlük tipik olarak bir mikrosaniyeden daha iyidir.

Ayrıca, kod snippet'lerini karşılaştırma için timeit modülü vardır .


4
"Bu, Python veya zamanlama algoritmalarını karşılaştırmak için kullanılacak işlevdir." <br> Python belgeleri, burada verilen yanıtlara dayanarak doğru görünmüyor. time.clock () her zaman kıyaslama için istediğiniz şey değildir. özellikle timeit modülünün varlığı ile
Corey Goldberg

1
@Corey Goldberg: Bir belge hatasıgönderdiniz ? (Onlar " ( time () yerine clock () kullan ) anlamına geliyordu , ama evet özensiz)
smci


3
As okunabilir burada o davranışını görünüyor time.clock()platformda oldu depedent ve time.process_time()değildir. Bu nedenle time.clock()kullanımdan kaldırıldı.
Jim Aho

46

Kısa cevap: çoğu zaman time.clock()daha iyi olacaktır. Ancak, bazı donanımları (örneğin GPU'ya koyduğunuz bazı algoritmaları) time.clock()zamanlıyorsanız, bu zamandan kurtulacak ve time.time()kalan tek çözüm bu olacaktır .

Not: kullanılan yöntem ne olursa olsun, zamanlama kontrol edemediğiniz faktörlere bağlı olacaktır (süreç ne zaman değişecek, ne sıklıkta değişecektir, ...), bu daha kötüdür, time.time()ancak aynı zamanda da mevcuttur time.clock(), bu yüzden asla sadece bir zamanlama testi çalıştırmamalısınız, ama her zaman bir dizi test yapın ve zamanların ortalama / varyansına bakın.


ayrıca ağ kaynağını zaman uyumsuz bir şekilde talep ederken (işlemin beklemesi engellenir), ağ zamanından kurtulur.
dasons


19

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

Bazı otomatik test uygulamalarını kontrol etmem gerekiyordu. Test senaryosunun bir adımı belirli bir süreden fazla sürerse, bu TC bir sonraki adımı sürdürmek için durduruldu.

Ancak bazen sistem saatini değiştirmek için bir adım gerekliydi (test edilen uygulamanın zamanlayıcı modülünü kontrol etmek için), bu nedenle sistem süresini birkaç saat sonra ayarladıktan sonra, TC zaman aşımı süresi doldu ve test durumu iptal edildi. Bunu düzgün işlemek için geçiş time.time()yapmak zorunda kaldım time.clock().


1
Bunu arıyordum. Teşekkürler :) Bir kullanıcı OS'den zamanını değiştirse bile bana yardımcı olacaktır.
Aashiq Hussain

Bu zamanı ve kullanıcı tarafından saklanan saati saat: dakika biçiminde nasıl karşılaştırabilirim?
Aashiq Hussain

19

clock() -> kayan nokta sayısı

İşlemin başlamasından bu yana veya ilk çağrıdan bu yana CPU zamanını veya gerçek zamanı döndürün clock(). Bu, sistemin kaydettiği kadar hassastır.

time() -> kayan nokta sayısı

Dönemden bu yana saniye cinsinden geçerli zamanı döndürür. Sistem saati bunları sağlıyorsa, bir saniyenin kesirleri bulunabilir.

Genellikle time()daha hassastır, çünkü işletim sistemleri, işlem çalışma süresini sistem saatini depoladıkları hassasiyetle (yani gerçek zaman) saklamaz


17

Önem verdiğiniz şeye bağlıdır. DUVAR ZAMANI (duvardaki saat üzerindeki zaman gibi) demek istiyorsanız, time.clock (), CPU zamanını yönetebileceğinden HİÇBİR doğruluk sağlamaz.


1
tam olarak, sadece time.clock()bir Linux sunucularında kullandım ve aldığım sayılar kesinlikle saniye değildi
Roman Plášil

15

time()clock()Linux'tan daha iyi bir hassasiyete sahiptir . clock()sadece 10 ms'den daha az hassasiyete sahiptir. Iken time()kaymakam hassasiyeti verir. Testim CentOS 6.4 , python 2.6'da

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

şarap üzerinde zaman () varsayalım ??
Tcll

6

Aradaki fark çok platforma özgüdür.

clock (), Windows'ta Linux'tan çok farklıdır.

Açıkladığınız örnekler için muhtemelen "timeit" modülünü istiyorsunuz.


3
Eğer yollar ne, genişletmek olabilir clockolduğunu "very different"?
n611x007

5

Diğerleri de belirtildiği gibi time.clock()lehine kullanımdan kaldırılmıştır time.perf_counter()veya time.process_time()ancak Python 3.7 tanıtır nanosaniye çözünürlük zamanlama ile time.perf_counter_ns(), time.process_time_ns()vetime.time_ns() 3 diğer işlevleri ile birlikte.

Bu 6 yeni nansecond çözünürlük fonksiyonu PEP 564'te detaylandırılmıştır :

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 soneki olmayan sürüme benzer, ancak Python int olarak birkaç nanosaniye döndürür.

Diğerlerinin de belirttiği gibi, fonksiyonları ve küçük kod parçacıklarını zamanlamak için timeitmodülü kullanın.


3

Unix'te time.clock (), geçerli işlem tarafından kullanılan CPU süresi miktarını ölçer; Windows'da, işleve yapılan ilk çağrıdan bu yana geçen duvar saati saniyelerini ölçer. Her iki sistemde de time.time () dönemi çağdan bu yana geçen saniyeleri döndürür.

Yalnızca Windows için tasarlanmış bir kod yazıyorsanız, her ikisi de çalışır (ancak ikisini farklı kullanırsınız - time.clock () için çıkarma gerekmez). Bu bir Unix sisteminde çalışacaksa veya taşınabilir olması garanti edilen bir kod istiyorsanız, time.time () öğesini kullanmak isteyeceksiniz.


2

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şleve yapılan ilk çağrıdan bu yana geçen saniyeleri kayan nokta sayısı olarak döndürür.

time (), UTC'den itibaren bir kayan nokta sayısı olarak çağdan bu yana geçen saniye sayısını döndürür. (Time () bir kayan nokta sayısı döndürmesine rağmen) 1 saniyeden daha iyi bir hassasiyet elde edeceğinizin garantisi yoktur. Ayrıca, sistem saati bu işleve iki çağrı arasında geri ayarlandıysa, ikinci işlev çağrısının daha düşük bir değer döndüreceğini unutmayın.


2

Anladığım kadarıyla, time.clock () sistemi sisteminizin izin verdiği kadar hassastır.


2

Bu yöntemi 2 yöntemi karşılaştırmak için 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ı:

zaman () = 0.0993799996376

saat () = 0,0993572257367


1

Doğru cevap: İkisi de aynı kesir uzunluğunda.

Ama daha hızlı eğer hangi subjectolduğu time?

Küçük bir test örneği :

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çreli laboratuarlarda çalışmıyorum ama test ettim ..

Bu soruya dayanarak: time.clock()daha iyidirtime.time()

Düzenleme: time.clock()dahili sayaç, bu yüzden dışarıda kullanılamaz, sınırlamalar var max 32BIT FLOAT, ilk / son değerleri saklamıyorsa saymaya devam edemez. Başka bir sayaç birleştirilemiyor ...


0

time.clock()platforma bağlı davranışları olduğu için Python 3.8'de kaldırıldı :

  • Açık Unix kayan nokta sayısı saniyede ifade edildiği gibi, mevcut işlemci zaman dönüş.
  • On Windows'un bu işlev bir kayan noktalı sayı olarak bu işlev için ilk çağrı yana geçen duvar saati saniye döndürür

    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux  :  0.0382  0.0384   # see Processor Time
    # Windows: 26.1224 36.1566   # see Wall-Clock Time

Peki yerine hangi fonksiyon seçilir?

  • İşlemci Süresi : Bu işlemin CPU üzerinde etkin bir şekilde yürütülmesi için harcanan zamandır. Uyku, bir web isteği beklemek veya yalnızca diğer işlemlerin yürütüldüğü süre buna katkıda bulunmaz.

    • kullanım time.process_time()
  • Duvar Saati Süresi : Bu, "duvarda asılı bir saatte" ne kadar zaman geçtiğini, yani gerçek zamanın dışında olduğunu ifade eder.

    • kullanım time.perf_counter()

      • time.time() Ayrıca duvar saati süresini de ölçer, ancak sıfırlanabilir, böylece zamanda geriye gidebilirsiniz
      • time.monotonic() sıfırlanamaz (monotonik = sadece ileri gider) ancak daha düşük bir hassasiyete sahiptir time.perf_counter()

-1

Ubuntu Linux ve Windows 7 arasındaki test sonucunu karşılaştırma.

Ubuntu hakkında

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873

Windows 7'de

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5

Windows ile Unix / Linux arasındaki farkı anlamak için lütfen diğer cevapları okuyun.
Corey Goldberg
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.