পাইথনের টাইমলক () বনাম সময়.টাইম () নির্ভুলতা?


428

পাইথনে টাইমিংয়ের জন্য কোনটি ব্যবহার করা ভাল? টাইমক্লক () বা টাইম.টাইম ()? কোনটি আরও সঠিকতা সরবরাহ করে?

উদাহরণ স্বরূপ:

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

বনাম

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

32
দ্রষ্টব্য যে পাইথন ৩.৩ অনুসারে, এর ব্যবহার time.clock()অবচিত করা হয়েছে এবং এর পরিবর্তে perf_counter()বা এর process_time()পরিবর্তে ব্যবহারের পরামর্শ দেওয়া হচ্ছে ।
কোডি পিয়ার্সাল


কোনও প্রক্রিয়া দ্বারা ব্যবহৃত সমস্ত কোর কীভাবে সংযুক্ত করা হয় এবং শিশু প্রক্রিয়াগুলি তা নয় সে সম্পর্কে এই মন্তব্যটি দেখুন । নির্ভুলতার এই আলোচনাটি দেখুন (অবশ্যই সিস্টেমের দ্বারা পরিবর্তিত হয়)। time.clocktime.process_time
সর্বোচ্চ

উত্তর:


161

৩.৩ অনুসারে, টাইমক্লক () অবহিত করা হয়েছে এবং এর পরিবর্তে সময়.প্রসেস_টাইম () বা টাইম.পার্ফ_কাউন্টার () ব্যবহার করার পরামর্শ দেওয়া হয়েছে ।

আগের মডিউল ডক্স অনুসারে 2.7 এ :

নির্দিষ্ট সময় নির্ধারণকারী ঘড়ি()

ইউনিক্সে, সেকেন্ডে প্রকাশিত ভাসমান পয়েন্ট সংখ্যা হিসাবে বর্তমান প্রসেসরের সময়টি ফিরুন। যথার্থতা এবং প্রকৃতপক্ষে "প্রসেসরের সময়" এর অর্থের খুব সংজ্ঞা, একই নামের সি ফাংশনের উপর নির্ভর করে, তবে যে কোনও ক্ষেত্রেই, পাইথন বা টাইমিং অ্যালগরিদমের বেঞ্চমার্কিংয়ের জন্য এটি ব্যবহৃত ফাংশন।

উইন্ডোজে, উইন 32 ফাংশন কোয়েরি পারফরম্যান্স কাউন্টার () এর উপর ভিত্তি করে এই ফাংশনটি প্রথম কল করার পরে ভাসমান পয়েন্ট সংখ্যা হিসাবে এই ফাংশনটির প্রথম কল হওয়ার পরে অবধি প্রাচীর-ঘড়ির সেকেন্ড ফিরে আসে। রেজোলিউশনটি সাধারণত একটি মাইক্রোসেকেন্ডের চেয়ে ভাল।

অতিরিক্তভাবে, বেঞ্চমার্কিং কোড স্নিপেটের জন্য টাইমিট মডিউল রয়েছে।


4
"পাইথন বা টাইমিং অ্যালগরিদমের বেঞ্চমার্কিংয়ের জন্য এটি ব্যবহার করা ফাংশন" "<br> পাইথন ডক্স এখানে দেওয়া উত্তরের ভিত্তিতে সঠিক বলে মনে হচ্ছে না। টাইমক্লক () সর্বদা আপনি বেঞ্চমার্কিংয়ের জন্য যা চান তা নয়। বিশেষত সময়কালীন মডিউলটির অস্তিত্বের সাথে
কোরি গোল্ডবার্গ

1
@ কোরি গোল্ডবার্গ: সুতরাং আপনি কি কোনও ডকুমেন্টেশন বাগ জমা দিয়েছেন ? (তাদের অর্থ সময়ের চেয়ে ( " ঘড়ি ব্যবহার করা () বোঝানো হয়েছিল ) ) , তবে হ্যাঁ এটি
আস্তে আস্তে


3
এখানে যেমন পড়া যেতে পারে মনে time.clock()হয় এর প্ল্যাটফর্মের আচরণ হতাশাগ্রস্ত ছিল, এবং time.process_time()তা নয়। এই কারণেই অবহেলা করা time.clock()হয়েছিল।
জিম আহো

46

সংক্ষিপ্ত উত্তরটি হ'ল: বেশিরভাগ সময়ই time.clock()ভাল। তবে, আপনি যদি কিছু হার্ডওয়্যার সময় নির্ধারণ করে থাকেন (উদাহরণস্বরূপ, আপনি জিপিইউতে রেখেছিলেন এমন কিছু অ্যালগোরিদম), তবে time.clock()এই সময় থেকে মুক্তি পাবেন এবং time.time()এটিই কেবলমাত্র একমাত্র সমাধান।

দ্রষ্টব্য: যে পদ্ধতিটিই ব্যবহার করা হোক না কেন, সময় নির্ধারণ করতে পারে না এমন কারণগুলির উপর নির্ভর করবে (প্রক্রিয়াটি কখন স্যুইচ করবে, কতবার, ...), এটি আরও খারাপ time.time()তবে এটির সাথেও উপস্থিত রয়েছে time.clock(), সুতরাং আপনার কখনই কেবল একটি সময় পরীক্ষা করা উচিত নয়, তবে সর্বদা পরীক্ষার একটি সিরিজ চালান এবং সময়ের গড় / বৈচিত্রটি দেখুন।


এছাড়াও একটি অ্যাসিঙ্ক উপায়ে নেটওয়ার্ক রিসোর্সের অনুরোধ করার সময় (প্রক্রিয়াটি অপেক্ষা করার জন্য অবরুদ্ধ করা হবে), নেটওয়ার্ক সময়টি পরিত্রাণ পাবে।
asonsতু

25

অন্যরা উত্তর দিয়েছেন: time.time()বনাম time.clock()

তবে, আপনি যদি বেঞ্চমার্কিং / প্রোফাইলিংয়ের উদ্দেশ্যে কোনও ব্লক কোড কার্যকর করার সময় নির্ধারণ করছেন, আপনার timeitমডিউলটি একবার দেখে নেওয়া উচিত ।


16
+1 টি: timeit.default_timerনির্ধারিত হয় time.time()বা time.clock()ওএস উপর নির্ভর করে। পাইথন 3.3+ উপর default_timerহয় time.perf_counter()সব প্ল্যাটফর্মে।
jfs

19

একটি জিনিস মনে রাখতে হবে: সিস্টেমের সময় পরিবর্তনগুলি প্রভাবিত করে time.time()তবে তা নয় time.clock()

আমার কিছু স্বয়ংক্রিয় পরীক্ষার মৃত্যুদণ্ড নিয়ন্ত্রণ করা দরকার। যদি পরীক্ষার কেসটির একটি পদক্ষেপ নির্দিষ্ট পরিমাণের চেয়ে বেশি সময় নেয়, তবে টিসি পরেরটির সাথে যেতে হবে।

তবে কখনও কখনও সিস্টেমের সময় পরিবর্তন করার জন্য একটি পদক্ষেপের প্রয়োজন হয় (পরীক্ষার অধীনে আবেদনের সিডিউল মডিউলটি পরীক্ষা করতে), সুতরাং ভবিষ্যতে সিস্টেমের সময়টি কয়েক ঘন্টা নির্ধারণের পরে, টিসি সময়সীমা শেষ হয়ে যায় এবং পরীক্ষার কেসটি বাতিল হয়ে যায়। এটি সঠিকভাবে পরিচালনা করতে আমাকে অন্য থেকে স্যুইচ time.time()করতে time.clock()হয়েছিল।


1
আমি এটা খুঁজছিলাম। ধন্যবাদ :) কোনও ব্যবহারকারী ওএস থেকে তার সময় পরিবর্তন করলেও এটি আমাকে সহায়তা করবে।
আশিক হুসেন

আমি কীভাবে এই বারটি এবং ঘন্টার মধ্যে মিনিট ফরমেটের ব্যবহারকারীর দ্বারা সঞ্চয় করা তুলনা করতে পারি?
আশিক হুসেন

19

clock() -> ভাসমান পয়েন্ট নম্বর

প্রক্রিয়া শুরু হওয়ার পরে বা প্রথম কল করার পর থেকেই সিপিইউ সময় বা আসল সময়টি ফেরত দিন clock()। এটি সিস্টেমের রেকর্ডের মতো যথাযথতা অর্জন করে।

time() -> ভাসমান পয়েন্ট নম্বর

যুগের পর থেকে সেকেন্ডে বর্তমান সময়টি ফিরুন। সিস্টেম ঘড়ি যদি তাদের সরবরাহ করে তবে একটি সেকেন্ডের ভগ্নাংশ উপস্থিত হতে পারে।

সাধারণত time() আরও সুনির্দিষ্ট, কারণ অপারেটিং সিস্টেমগুলি প্রক্রিয়া চলমান সময়টিকে যথাযথভাবে সিস্টেমের সময় সঞ্চয় করে না (যেমন, প্রকৃত সময়)


17

আপনি যা যত্ন করেন তার উপর নির্ভর করে। যদি আপনি ওয়াল টাইমকে বোঝাতে চান (যেমনটি আপনার দেওয়ালের ঘড়ির সময়), টাইমক্লক () কোনও যথার্থতা সরবরাহ করে না কারণ এটি সিপিইউ সময় পরিচালনা করতে পারে।


1
ঠিক, আমি কেবল time.clock()একটি লিনাক্স সার্ভারে ব্যবহার করেছি এবং আমি যে নম্বর পেয়েছি তা অবশ্যই সেকেন্ড নয়
রোমান প্লিল

15

time()clock()লিনাক্সের চেয়ে ভাল নির্ভুলতা রয়েছে । clock()কেবলমাত্র 10 এমএসের চেয়ে কম নির্ভুলতা রয়েছে। time()প্রিফেক্ট নির্ভুলতা দেয় যখন । আমার পরীক্ষাটি সেন্টস 6.4 y পাইথন 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 প্রবর্তন ন্যানোসেকেন্ড রেজল্যুশন সময়জ্ঞান time.perf_counter_ns(), time.process_time_ns()এবংtime.time_ns() , 3 অন্যান্য কার্যাবলী করেন।

এই 6 টি নতুন ন্যানসেকেন্ড রেজোলিউশন ফাংশনগুলি পিইপি 564 তে বিস্তারিত রয়েছে :

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

ইউনিক্স টাইমলকোলে () বর্তমান প্রসেস দ্বারা ব্যবহৃত সিপিইউ সময়ের পরিমাণ পরিমাপ করে, অতএব অতীতের কিছু সময় থেকে অতিবাহিত সময় পরিমাপ করা ভাল নয়। উইন্ডোজে এটি ফাংশনটিতে প্রথম কল করার পরে কেটে গেছে ওয়াল-ক্লক সেকেন্ড পরিমাপ করবে। উভয়ই সিস্টেমে সময়। সময় () পর্বের সময় পেরিয়ে কয়েক সেকেন্ড ফিরে আসবে।

যদি আপনি কোডটি কেবল উইন্ডোজের জন্যই লিখছেন তবে তা কাজ করবে (যদিও আপনি দুটিটি আলাদাভাবে ব্যবহার করবেন - টাইমলক্লক ()) এর জন্য কোনও বিয়োগ প্রয়োজন হয় না। যদি এটি কোনও ইউনিক্স সিস্টেমে চলছে বা আপনি যে কোডটি পোর্টেবল হওয়ার গ্যারান্টিযুক্ত চান তা চাইলে আপনি সময়.টাইম () ব্যবহার করতে চাইবেন।


2

সংক্ষিপ্ত উত্তর: পাইথনে সময় দেওয়ার জন্য টাইমক্লক () ব্যবহার করুন।

* নিক্স সিস্টেমে, ক্লক () প্রসেসরের সময়টিকে স্লোকেটে প্রকাশিত ভাসমান পয়েন্ট সংখ্যা হিসাবে প্রত্যাবর্তন করে। উইন্ডোজে, এটি একটি ফ্লোটিং পয়েন্ট নম্বর হিসাবে এই ফাংশনটিতে প্রথম কল করার পরে কেটে যাওয়া সেকেন্ডগুলি দেয় returns

সময় () ইউটিসি-তে, মহাসমাবেশের পর থেকে সেকেন্ডটি ফেরত দেয় একটি ভাসমান পয়েন্ট নম্বর হিসাবে। কোনও গ্যারান্টি নেই যে আপনি আরও ভাল নির্ভুলতা পাবেন যে 1 সেকেন্ড (যদিও সময় () একটি ভাসমান পয়েন্ট নম্বর দেয়)। আরও মনে রাখবেন যে যদি সিস্টেম ঘড়িটি এই ফাংশনে দুটি কলের মধ্যে আবার সেট করা থাকে, তবে দ্বিতীয় ফাংশন কলটি একটি কম মান ফিরে আসবে।


2

আমার বোধগম্যতার পক্ষে, টাইম.লক () আপনার সিস্টেম যতটা অনুমতি দেবে ততই নির্ভুলতা রয়েছে।


2

আমি 2 টি পদ্ধতির তুলনা করার জন্য এই কোডটি ব্যবহার করি y আমার ওএসটি উইন্ডোজ 8, প্রসেসরের কোর আই 5, র‌্যাম 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()পাইথন ৩.৮-তে সরানো হয়েছে কারণ এটির প্ল্যাটফর্ম-নির্ভর আচরণ ছিল :

  • উপর ইউনিক্স ফিরে বর্তমান প্রসেসর সময় হিসাবে একটি ফ্লোটিং পয়েন্ট সংখ্যা সেকেন্ডের মধ্যে প্রকাশ করা হয়।
  • উপর উইন্ডোজ , এই ফাংশন দেওয়াল-ঘড়ি সেকেন্ড এই ক্রিয়াকলাপের প্রথম কল থেকে অতিবাহিত, ফেরৎ একটি ফ্লোটিং পয়েন্ট নম্বর হিসাবে

    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

উইন্ডোজ বনাম ইউনিক্স / লিনাক্সের পার্থক্য বুঝতে দয়া করে অন্যান্য উত্তরগুলি পড়ুন।
কোরি গোল্ডবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.