पाइथन का समय.लोक () बनाम समय.समय () सटीकता?


428

पायथन में समय के लिए उपयोग करना बेहतर है? time.clock () या time.time ()? कौन सा अधिक सटीकता प्रदान करता है?

उदाहरण के लिए:

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

बनाम

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

32
ध्यान दें कि पायथन 3.3 के रूप में, का उपयोग time.clock()पदावनत किया जाता है , और इसका उपयोग करने perf_counter()या process_time()इसके बजाय की सिफारिश की जाती है ।
कोडी पियर्सल


देखें इस टिप्पणी कैसे एक प्रक्रिया के द्वारा उपयोग किए गए सभी कोर में अभिव्यक्त किया जाता है के बारे में time.clockऔर time.process_timeहै, लेकिन बच्चे की प्रक्रिया नहीं हैं। सटीक की इस चर्चा को भी देखें (बेशक, सिस्टम द्वारा भिन्न होता है)।
अधिकतम

जवाबों:


161

3.3 के रूप में, time.clock () पदावनत है , और इसके बजाय time.process_time () या time.perf_counter () का उपयोग करने का सुझाव दिया गया है ।

इससे पहले 2.7 में, समय के अनुसार डॉक्स :

समय घड़ी()

यूनिक्स पर, वर्तमान प्रोसेसर समय को सेकंड में व्यक्त फ्लोटिंग पॉइंट संख्या के रूप में वापस करें। सटीक, और वास्तव में "प्रोसेसर समय" के अर्थ की बहुत परिभाषा, उसी नाम के सी फ़ंक्शन पर निर्भर करता है, लेकिन किसी भी मामले में, यह पायथन या टाइमिंग एल्गोरिदम बेंचमार्किंग के लिए उपयोग करने के लिए फ़ंक्शन है।

Windows पर, यह फ़ंक्शन Win32 फ़ंक्शन QueryPerformanceCounter () के आधार पर, फ़्लोटिंग पॉइंट नंबर के रूप में इस फ़ंक्शन पर पहली कॉल के बाद से दीवार-घड़ी सेकंड वापस आ जाता है। रिज़ॉल्यूशन आमतौर पर एक माइक्रोसेकंड से बेहतर है।

इसके अतिरिक्त, बेंचमार्किंग कोड स्निपेट्स के लिए टाइमिट मॉड्यूल है।


4
"यह पायथन या टाइमिंग एल्गोरिदम को बेंचमार्किंग के लिए उपयोग करने का कार्य है।" <br> पायथन डॉक्स यहां दिए गए उत्तरों के आधार पर सटीक नहीं लगता है। time.clock () हमेशा वह नहीं है जो आप बेंचमार्किंग के लिए चाहते हैं। विशेष रूप से टाइमिट मॉड्यूल के अस्तित्व के साथ
कोरी गोल्डबर्ग

1
@ कोरी गोल्डबर्ग: तो क्या आपने एक दस्तावेज बग जमा किया है ? (उनका मतलब था " समय के बजाय घड़ी () का उपयोग करें ) : ( , हाँ, यह टेढ़ा है)
smci


3
जैसा कि यहां पढ़ा जा सकता है, ऐसा लगता है time.clock()कि मंच पर व्यवहार में उदासीनता थी, और time.process_time()नहीं है। यही कारण है कि time.clock()पदावनत किया गया।
जिम अहो

46

संक्षिप्त उत्तर है: अधिकांश समय time.clock()बेहतर होगा। हालाँकि, यदि आप कुछ हार्डवेयर का समय निर्धारित कर रहे हैं (उदाहरण के लिए कुछ एल्गोरिदम जिसे आपने GPU में रखा है), तो time.clock()इस समय से छुटकारा मिल जाएगा और time.time()एकमात्र समाधान बचा है।

नोट: जो भी तरीका इस्तेमाल किया गया है, वह समय उन कारकों पर निर्भर करेगा जिन्हें आप नियंत्रित नहीं कर सकते हैं (जब प्रक्रिया स्विच करेगी, कितनी बार, ...), यह बदतर है time.time()लेकिन साथ ही मौजूद है time.clock(), इसलिए आपको कभी भी केवल एक समय परीक्षण नहीं चलाना चाहिए लेकिन हमेशा परीक्षण की एक श्रृंखला चलाते हैं और समय के माध्य / विचरण को देखते हैं।


यह भी जब एक async तरीके से नेटवर्क संसाधन का अनुरोध (प्रक्रिया प्रतीक्षा के लिए अवरुद्ध हो जाएगा), नेटवर्क समय से छुटकारा मिल जाएगा।
dasons

25

दूसरों ने फिर से जवाब दिया: time.time()बनाम time.clock()

हालाँकि, यदि आप बेंचमार्किंग / प्रोफाइलिंग उद्देश्यों के लिए कोड के ब्लॉक को निष्पादित कर रहे हैं, तो आपको timeitमॉड्यूल पर एक नज़र डालनी चाहिए ।


16
+1: OS पर या उसके आधार पर timeit.default_timerअसाइन किया गया है अजगर 3.3+ पर है सभी प्लेटफार्मों पर। time.time()time.clock()default_timertime.perf_counter()
jfs

19

एक बात का ध्यान रखें: सिस्टम का समय बदलने से प्रभाव पड़ता है time.time()लेकिन नहीं time.clock()

मुझे कुछ स्वचालित परीक्षणों को नियंत्रित करने की आवश्यकता थी। यदि परीक्षण के मामले के एक कदम को दिए गए समय से अधिक समय लगा, तो उस टीसी को अगले एक के साथ जाने के लिए निरस्त कर दिया गया।

लेकिन कभी-कभी सिस्टम के समय को बदलने के लिए एक कदम की आवश्यकता होती है (परीक्षण के तहत आवेदन के अनुसूचक मॉड्यूल की जांच करने के लिए), इसलिए भविष्य में कुछ घंटों के लिए सिस्टम समय निर्धारित करने के बाद, टीसी समय समाप्त हो गया और परीक्षण मामले को निरस्त कर दिया गया। मैं से स्विच करना पड़ा time.time()करने के लिए time.clock()इस ठीक से संभाल।


1
मुझे इसकी तलाश थी। धन्यवाद :) अगर कोई उपयोगकर्ता ओएस से अपना समय बदलता है तो भी यह मेरी मदद करेगा।
आशिक हुसैन

मैं इस समय और उपयोगकर्ता द्वारा घंटे: मिनट प्रारूप में संग्रहीत कैसे तुलना कर सकता हूं?
आशिक हुसैन

19

clock() -> फ्लोटिंग पॉइंट नंबर

प्रक्रिया की शुरुआत या पहली कॉल के बाद से सीपीयू समय या वास्तविक समय लौटाएं clock()। यह सिस्टम रिकॉर्ड के रूप में अधिक सटीक है।

time() -> फ्लोटिंग पॉइंट नंबर

युग के बाद से सेकंड में वर्तमान समय लौटें। यदि सिस्टम घड़ी उन्हें प्रदान करता है, तो एक सेकंड के अंश मौजूद हो सकते हैं।

आमतौर time()पर अधिक सटीक होता है, क्योंकि ऑपरेटिंग सिस्टम प्रक्रिया को चलाने के समय को उस सटीकता के साथ संग्रहीत नहीं करते हैं जो वे सिस्टम समय (यानी, वास्तविक समय) को संग्रहीत करते हैं।


17

इस बात पर निर्भर करता है कि आपको क्या परवाह है। यदि आपका अर्थ है WALL TIME (जैसे, आपकी दीवार पर घड़ी का समय), time.clock () कोई सटीकता प्रदान नहीं करता है क्योंकि यह CPU समय का प्रबंधन कर सकता है।


1
ठीक है, मैं सिर्फ time.clock()एक लिनक्स सर्वर पर इस्तेमाल किया था और मुझे निश्चित रूप से जो नंबर मिले थे वे सेकंड नहीं थे
रोमन प्लाज़ेल

15

time()clock()लिनक्स पर की तुलना में बेहतर परिशुद्धता है । clock()केवल 10 एमएस से कम सटीकता है। जबकि time()प्रीफेक्ट सटीक देता है। मेरा परीक्षण CentOS 6.4 th पायथन 2.6 पर है

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

इसलिए मैं शराब पर समय () मानता हूं ??
Tcll

6

अंतर बहुत मंच-विशिष्ट है।

घड़ी () लिनक्स पर विंडोज की तुलना में बहुत अलग है, उदाहरण के लिए।

आपके द्वारा वर्णित उदाहरणों के प्रकार के लिए, आप संभवतः "टाइमिट" मॉड्यूल चाहते हैं।


3
आप किस तरह से विस्तार कर सकता है, clockहै "very different"?
n611x007

5

दूसरों का उल्लेख किया है के रूप में time.clock()के पक्ष में पदावनत किया गया है time.perf_counter()या time.process_time()है, लेकिन अजगर 3.7 द्वारा प्रस्तुत nanosecond साथ संकल्प समय time.perf_counter_ns(), time.process_time_ns()है, और time.time_ns(), 3 अन्य कार्यों के साथ।

पीईपी 564 में ये 6 नए नानसेकंड संकल्प कार्य विस्तृत हैं :

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

ये फ़ंक्शन _ns प्रत्यय के बिना संस्करण के समान हैं, लेकिन पायथन इंट के रूप में कई नैनोसेकंड लौटाते हैं।

जैसा कि दूसरों ने भी उल्लेख किया है, timeitमॉड्यूल का उपयोग समय के कार्यों और छोटे कोड स्निपेट्स के लिए करें।


3

Unix time.clock () में वर्तमान प्रक्रिया द्वारा उपयोग किए जाने वाले CPU समय की मात्रा को मापता है, इसलिए यह अतीत में किसी बिंदु से बीता हुआ समय मापने के लिए अच्छा नहीं है। विंडोज पर यह फंक्शन के पहले कॉल के बाद से दीवार-घड़ी के सेकंड को मापेगा। या तो सिस्टम time.time () सेकंड के बाद से पारित सेकंड लौटेगा।

यदि आप ऐसा कोड लिख रहे हैं जो केवल विंडोज के लिए है, तो या तो काम करेगा (हालांकि आप दो अलग-अलग उपयोग करेंगे - time.clock ()) के लिए कोई घटाव आवश्यक नहीं है। यदि यह एक यूनिक्स प्रणाली पर चलने वाला है या आप चाहते हैं कि कोड पोर्टेबल होने की गारंटी हो, तो आप time.time () का उपयोग करना चाहेंगे।


2

संक्षिप्त उत्तर: पायथन में समय के लिए time.clock () का उपयोग करें ।

* Nix सिस्टम पर, घड़ी () सेकेंड में व्यक्त फ्लोटिंग पॉइंट नंबर के रूप में प्रोसेसर समय को लौटाती है। विंडोज पर, यह इस फ़ंक्शन के लिए पहली कॉल के बाद से एक अस्थायी बिंदु संख्या के रूप में बीता हुआ सेकंड लौटाता है।

समय (), यूटीसी में, एक अस्थायी बिंदु संख्या के रूप में, सेकंड के बाद से सेकंड लौटाता है। इस बात की कोई गारंटी नहीं है कि आपको एक बेहतर सटीकता मिलेगी कि 1 सेकंड (भले ही समय () एक अस्थायी बिंदु संख्या लौटाता है)। इस बात पर भी ध्यान दें कि अगर इस फ़ंक्शन के लिए सिस्टम कॉल को दो कॉल के बीच वापस सेट किया गया है, तो दूसरा फ़ंक्शन कॉल कम मान लौटाएगा।


2

मेरी समझ में सबसे अच्छा करने के लिए, time.clock () में उतनी ही सटीकता है जितनी आपके सिस्टम को इसकी अनुमति होगी।


2

मैं 2 तरीकों की तुलना करने के लिए इस कोड का उपयोग करता हूं। मेरा ओएस विंडोज 8, प्रोसेसर कोर i5, रैम 4 जीबी है

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

उत्पादन:

समय () = 0.0993799996376

घड़ी () = 0.0993572257367


1

सही उत्तर: वे दोनों एक ही लंबाई के हैं।

लेकिन अगर कौन सा तेज subjectहै time?

थोड़ा परीक्षण मामला :

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

मैं एक स्विस प्रयोगशाला काम नहीं कर रहा हूँ, लेकिन मैं परीक्षण किया है ..

इस प्रश्न के आधार पर: time.clock()से बेहतर हैtime.time()

संपादित करें: time.clock()आंतरिक काउंटर है ताकि बाहर का उपयोग नहीं किया जा सके, सीमाएं मिलीं max 32BIT FLOAT, यदि पहले / अंतिम मूल्यों को संग्रहीत नहीं किया गया है तो गिनती जारी नहीं रख सकते। एक और एक काउंटर मर्ज नहीं कर सकते ...


0

time.clock()पायथन 3.8 में हटा दिया गया था क्योंकि इसमें प्लेटफ़ॉर्म-निर्भर व्यवहार था :

  • पर यूनिक्स , लौट वर्तमान प्रोसेसर समय के रूप में एक चल बिन्दु संख्या सेकंड में व्यक्त किया।
  • पर विंडोज , इस समारोह दीवार-घड़ी सेकंड इस समारोह के लिए पहली कॉल के बाद से बीते, रिटर्न एक चल बिन्दु संख्या के रूप में

    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

तो बजाय लेने के लिए कौन सा कार्य?

  • प्रोसेसर समय : यह वह समय है जब यह विशिष्ट प्रक्रिया सीपीयू पर सक्रिय रूप से निष्पादित की जा रही है। नींद, एक वेब अनुरोध का इंतजार, या समय जब केवल अन्य प्रक्रियाओं को निष्पादित किया जाता है, इसमें योगदान नहीं होगा।

    • उपयोग time.process_time()
  • वॉल-क्लॉक टाइम : यह संदर्भित करता है कि "दीवार पर लटकी घड़ी पर" कितना समय बीत चुका है, अर्थात वास्तविक समय के बाहर।

    • उपयोग time.perf_counter()

      • time.time() दीवार-घड़ी के समय को भी मापता है, लेकिन रीसेट किया जा सकता है, इसलिए आप समय में वापस जा सकते हैं
      • time.monotonic() रीसेट नहीं किया जा सकता (मोनोटोनिक = केवल आगे जाता है) लेकिन की तुलना में कम परिशुद्धता है time.perf_counter()

-1

उबंटू लिनक्स और विंडोज 7 के बीच तुलनात्मक परीक्षा परिणाम।

उबंटू पर

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

विंडोज 7 पर

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

विंडोज़ बनाम यूनिक्स / लिनक्स पर अंतर समझने के लिए कृपया अन्य उत्तर पढ़ें।
कोरी गोल्डबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.