2013-03-02 6 views
6

मैं अपने कोड का एक स्निपेट टाइम करना चाहता हूं, और मुझे केवल सीपीयू निष्पादन समय चाहिए (ऑपरेटिंग सिस्टम प्रक्रियाओं को अनदेखा करना आदि)।एक अजगर कार्यक्रम के CPU समय का समय?

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

मैंने लगभग एक घंटे के लिए समय-समय पर खेला है। अनिवार्य रूप से जो मेरे लिए इसे मारता है वह "सेटअप" प्रक्रिया है, मैं लगभग 20 कार्यों को आयात करना चाहता हूं जो अव्यवहारिक है क्योंकि मैं व्यावहारिक रूप से बस सेटअप कोड में अपना कोड पुनः लिखने और उपयोग करने के लिए लिख रहा हूं।

सीप्रोफाइल अधिक से अधिक आकर्षक लग रहे हैं, लेकिन क्या वे CPU समय लौटाते हैं? भी, एक मामूली बिंदु - यह बहुत अधिक जानकारी के तरीके outputs। क्या आउटपुट की गई जानकारी को txt या .dat फ़ाइल में प्राप्त करने का कोई तरीका है, इसलिए मैं इसे वास्तव में पढ़ सकता हूं?

चीयर्स

ओएस: उबंटू कार्यक्रम: अजगर 2.7

+2

ध्यान दें कि आपको प्रत्येक दौड़ के लिए अलग-अलग समय मिलेंगे, भले ही आप केवल अपनी प्रक्रिया द्वारा खाए गए सीपीयू चक्रों को गिनना चाहते हों। यह सीपीयू कैश की वजह से है, जो हर समय अलग-अलग राज्य (आपके पता स्थान के विभिन्न हिस्सों वाले) में समाप्त हो जाएगा। सीपीयू कैश प्रक्रियाओं के बीच साझा किया जाता है, इसलिए आप गारंटी नहीं दे सकते कि उदाहरण के लिए हर बार जब आप अपना कोड चलाएंगे, तो एक निश्चित चर को कैश में रखा जाएगा। – liori

+0

[resource.getrusage] (http://docs.python.org/2/library/resource.html) का उपयोग पायथन 2.7 – Annan

उत्तर

7

ऐसा लगता है कि आप देख रहे हैं की तरह प्रक्रिया चौड़ा निष्पादन समय समय के लिए एक रास्ता के लिए, सबसे अच्छी बात आप कर सकते हैं timeit.default_timer() का उपयोग है जो वर्तमान प्लेटफॉर्म पर उपलब्ध सबसे सटीक समय .clock() या time.time() फ़ंक्शन प्रदान करता है, लेकिन यह सिस्टम-व्यापी समय है, जिसका अर्थ है कि अन्य प्रोसेस आपके माप में हस्तक्षेप कर सकती हैं।

एक डिफ़ॉल्ट घड़ी को परिभाषित करें, एक प्लेटफ़ॉर्म-विशिष्ट ढंग से:

यहाँ timeit.default_timer की डॉक्स() से जानकारी है। विंडोज़ पर, time.clock() में माइक्रोसॉन्ड ग्रैन्युलरिटी है, लेकिन टाइम.टाइम() की ग्रैन्युलरिटी एक सेकंड का 1/60 वां है। यूनिक्स पर, time.clock() में दूसरी ग्रैन्युलरिटी के 1/100 वें हैं, और time.time() अधिक सटीक है। या तो मंच, default_timer() दीवार घड़ी का समय मापता है, सीपीयू समय नहीं। इसका मतलब है कि एक ही कंप्यूटर पर चल रही अन्य प्रक्रियाएं समय के साथ हस्तक्षेप कर सकती हैं।

आपको सी-मॉड्यूल का परीक्षण करने की कोशिश करनी चाहिए, जिनके पास अलग-अलग समय एपिस तक पहुंच हो सकती है।

वापसी मान (आंशिक सेकंड में:


यह करने के लिए सबसे अच्छा संभव तरीके से time.process_time() जो अजगर 3.3 में ही उपलब्ध है और ऊपर का उपयोग करना है, यहाँ डॉक्स से जानकारी है) सिस्टम की राशि और वर्तमान प्रक्रिया के उपयोगकर्ता CPU समय। इसमें नींद के दौरान बीतने का समय शामिल नहीं है। परिभाषा के अनुसार यह प्रक्रिया-व्यापी है। का संदर्भ बिंदु लौटा हुआ मान अपरिभाषित है, ताकि के बीच केवल अंतर लगातार कॉल के परिणाम मान्य हो।

+4

में प्रक्रिया समय प्राप्त करने के लिए किया जा सकता है अच्छा जवाब, लेकिन 'process_time' केवल पायथन 3.3 में उपलब्ध है और बाद में, वह 2.7 का उपयोग कर रहा है। – omz

+0

दमन आप सही हैं – Shedokan

+3

'timeit.default_timer()' Python 3.3+ पर 'time.perf_counter()' है। उबंटू पर पाइथन 2 के लिए ['time.process_time()' और 'time.perf_counter()' है।] (Https://gist.github.com/zed/5073409) – jfs

3

time.clock() के बजाय, timeit.default_timer() का उपयोग करें; यह आपके मंच के लिए सबसे सटीक विकल्प का उपयोग करता है।उबंटू के लिए, उदाहरण के लिए, यह इसके बजाय time.time() का उपयोग करेगा।

timeit का उपयोग करते समय, एक सेटअप फ़ंक्शन बनाएं जिसे आप timeit के लिए फिर से उपयोग कर सकते हैं। हां, यह कुछ काम की तरह दिखता है लेकिन यह सुनिश्चित करता है कि आप जो समय वास्तव में मापना चाहते थे, और समय-महत्वपूर्ण मापा अनुभाग में सेटअप कोड शामिल न करें।

संबंधित मुद्दे