অজগর কোডের লাইনের মধ্যে নেওয়া সময়কে কীভাবে পরিমাপ করবেন?


98

জাভাতে, আমরা কীভাবে কার্যকর করতে কোনও ফাংশন দ্বারা সময় গ্রহণ করতে পারি তা কীভাবে করতে পারি

তবে অজগরে এটি কীভাবে হয়? কোড লাইনগুলির মধ্যে সময় শুরুর এবং শেষের সময়টি মাপতে? এমন কিছু যা এটি করে:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

উত্তর:


150

আপনি যদি সিপিইউ সময় পরিমাপ করতে চান তবে time.process_time()পাইথন ৩.৩ এবং তারপরের জন্য ব্যবহার করতে পারেন :

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

প্রথম কলটি টাইমারটি চালু করে এবং দ্বিতীয় কল আপনাকে জানায় যে কত সেকেন্ড অতিক্রান্ত হয়েছে।

এছাড়াও একটি ফাংশন রয়েছে time.clock(), তবে পাইথন ৩.৩ থেকে এটি অবচয় করা হয়েছে এবং পাইথন ৩.৮-এ সরানো হবে।

ভাল প্রোফাইলিং সরঞ্জাম মত আছে timeitএবং profiletime.process_time তবে, () CPU- র সময় পরিমাপ হবে এবং এই আপনি কি জিজ্ঞাসা করা হয় করছি।

পরিবর্তে যদি আপনি প্রাচীর ঘড়ির সময় পরিমাপ করতে চান তবে ব্যবহার করুন time.time()


52
এটি আপনি কীভাবে ব্যবহার করেন না তা নয় time.clock()এবং time.clock()ইউনিক্সে সিপিইউ সময়টি উইন্ডোজে দেয়াল সময়কে পরিমাপ করে। time.time()ওএসের সাথে আচরণের পরিবর্তিত হয় না এমনটি ব্যবহার করা ভাল । stackoverflow.com/questions/85451/…
টিম

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

4
Time.time () সম্পর্কে একটি খুব খারাপ জিনিস যে এটা সময় sunchronization ntpdate ইত্যাদি আমি বলতে হবে time.clock () এই কারণে শুধুমাত্র নির্ভরযোগ্য বিকল্প হবে দ্বারা প্রভাবিত হয়
www.jensolsson.se

4
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
ইসমাইলালিক

4
হুম ... নিশ্চিত না আমি কী ভুল করছি doing আমি প্রতিস্থাপন # your code hereকরেছি time.sleep(10)এবং 0.0 সেকেন্ড পেয়েছি। যোগ করা for i in range(10000):/passএকই ফলাফল উত্পাদিত। যে কোনও পরিস্থিতিতে আমি চেষ্টা করেছি, time.process_time()সর্বদা একই সংখ্যাটি দেয়। time.perf_counter()যদিও আমি ব্যবহার করে প্রত্যাশিত ফলাফল পেয়েছি
বিস্কুট 314

56

আপনি timeগ্রন্থাগারও ব্যবহার করতে পারেন :

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

4
@ হাইয়াত - এই পদ্ধতিটি ইউটিসি-র যুগে যুগে যুগে যুগে সেকেন্ডে প্রকাশিত ভাসমান পয়েন্ট সংখ্যা হিসাবে সময় দেয়। [ ডকস.পিথন.আর.৩ / ৩
লাইব্রেরি

@ আনুময়সূত্রধর সত্যই নয়, যেহেতু এটি একটি মহাকাশ থেকে মহাকালের বিয়োগ করছে, আপনি দুটি সময়ের মধ্যে সময়ের পার্থক্য পাবেন।
নাস্তা

28

একটি ছোট সুবিধার্থ শ্রেণীর সহায়তায় আপনি ইন্ডেন্টেড লাইনে ব্যয় করা সময়কে এইভাবে পরিমাপ করতে পারেন :

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

ইনডেন্টড লাইন (গুলি) সম্পাদন শেষ হওয়ার পরে যা নিম্নলিখিতগুলি দেখায়:

Code block took: x.xxx ms

আপডেট: আপনি এখন pip install linetimerএবং তার সাথে ক্লাস পেতে পারেন from linetimer import CodeTimer। দেখুন এই GitHub প্রকল্পের

উপরের শ্রেণীর জন্য কোড:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

তারপরে আপনি যে কোড ব্লকগুলি পরিমাপ করতে চান তার নাম রাখতে পারেন:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

এবং তাদের নীড় :

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

সম্পর্কিত timeit.default_timer(), এটি ওএস এবং পাইথন সংস্করণের উপর ভিত্তি করে সেরা টাইমার ব্যবহার করে, এই উত্তরটি দেখুন


9

আমি সর্বদা ঘন্টা, মিনিট এবং সেকেন্ডে (% এইচ:% এম:% এস) ফর্ম্যাটটিতে সময় পরীক্ষা করতে পছন্দ করি:

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

আউটপুট:

Time:  0:00:00.000019

3

আমি কীভাবে ন্যূনতম কোড সহ একটি ফর্ম্যাট সময় আউটপুট করতে পারি তার একটি উপায় সন্ধান করছিলাম, সুতরাং আমার সমাধানটি এখানে। অনেক লোক পান্ডাস ব্যবহার করুন যাইহোক, তাই কিছু ক্ষেত্রে এটি অতিরিক্ত পাঠাগার আমদানি থেকে বাঁচাতে পারে।

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

আউটপুট:

0 days 00:05:32.541600

যদি সময়ের যথার্থতা সবচেয়ে গুরুত্বপূর্ণ না হয় তবে আমি এটি ব্যবহার করার পরামর্শ দেব, অন্যথায় timeগ্রন্থাগারটি ব্যবহার করুন :

%timeit pd.Timestamp.now() লুপ প্রতি আউটপুট 3.29 ±s ± 214 এনএস

%timeit time.time() প্রতি লুপে 154 এনএস ± 13.3 এনএস আউটপুট দেয়



1

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

প্রথমে timerসজ্জা নির্ধারণকারী :

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

তারপরে, ফাংশনটি সংজ্ঞায়িত করার সময় সাজসজ্জার ব্যবহার করুন:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

আসুন চেষ্টা করুন:

doubled_and_add(100000)
doubled_and_add(1000000)

আউটপুট:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

দ্রষ্টব্য: time.perf_counterপরিবর্তে কেন ব্যবহার করবেন তা নিশ্চিত নই time.time। মন্তব্য স্বাগত।

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