মতলবের টিক এবং টোক ফাংশনের পাইথন সমতুল্য কী?


112

মতলবের টিক এবং টোক ফাংশনের পাইথন সমতুল্য কী ?


7
আপনি যদি সত্যিই সরাসরি সমতুল্য চান, কেবল কল করুন tic = time.time()এবং toc = time.time(), তবে লোকেদের print toc-tic, 'sec Elapsed'যেমন নীচে বলেছেন, তবে timeitএটি আরও দৃ rob়।
জো কিংটন

টাইমিট.ডিফোল্ট_টিমার () এর সাথে মিলে @ জোকিংটনের পদ্ধতির ব্যবহার করে আমি আরও ভাল ফলাফল পেয়েছি বলে মনে হচ্ছে tic = timeit.default_timer(); (U,S,V) = np.linalg.svd(A); toc = timeit.default_timer(), উদাহরণস্বরূপ: তারপরে print toc-tic
লিটল

1
পাইটিকট লাইব্রেরিটি সর্বাধিক প্রশংসনীয় বলে মনে হচ্ছে, সিনট্যাক্স নীচের টাইটোকটকের চেয়ে কিছুটা কম। pypi.org/project/pytictoc
ফ্লোরিয়ানএইচ

উত্তর:


172

timeitথিফ মাস্টার উল্লেখ করেছে, সেগুলি ছাড়াও এটি করার একটি সহজ উপায় হ'ল (আমদানির পরে time):

t = time.time()
# do stuff
elapsed = time.time() - t

আমার একটি সহায়ক ক্লাস রয়েছে যা আমি ব্যবহার করতে পছন্দ করি:

class Timer(object):
    def __init__(self, name=None):
        self.name = name

    def __enter__(self):
        self.tstart = time.time()

    def __exit__(self, type, value, traceback):
        if self.name:
            print('[%s]' % self.name,)
        print('Elapsed: %s' % (time.time() - self.tstart))

এটি একটি প্রসঙ্গ পরিচালক হিসাবে ব্যবহার করা যেতে পারে:

with Timer('foo_stuff'):
   # do some foo
   # do some stuff

কখনও কখনও আমি এই কৌশলটি বেশি সুবিধাজনক বলে মনে করি timeit- এটি সমস্ত কি আপনি পরিমাপ করতে চান তার উপর নির্ভর করে।


25
@ বার: আমি শ্রদ্ধার সাথে একমত নই লোকেরা timeসর্বদা জন্য প্রোগ্রামগুলির রানটাইম পরিমাপ করতে ইউনিক্স কমান্ডটি ব্যবহার করে আসছে এবং এই পদ্ধতিটি পাইথন কোডের অভ্যন্তরে এটি প্রতিলিপি করে। আমি এতে কোনও ভুল দেখছি না, যতক্ষণ না এটি কাজের সঠিক হাতিয়ার। timeitসর্বদা তা নয়, এবং একজন প্রোফাইলার বেশিরভাগ প্রয়োজনের জন্য অনেক বেশি ভারী
ওজনের

4
শেষ লাইনের জন্য আমি পরামর্শ দেব print 'Elapsed: %.2f seconds % (time.time() - self.tstart)'। এটি% .2f ছাড়া বোঝা শক্ত। দুর্দান্ত ধারণা জন্য ধন্যবাদ।
Kavaklıoğlu

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

1
আমি মনে করি আপনি চান elapsed = t - time.time()পরিবর্তে elapsed = time.time() - t। পরবর্তী সময়টি নেতিবাচক হবে। আমি এই পরিবর্তনটি সম্পাদনা হিসাবে প্রস্তাব করেছি।
rysqui

3
@ রাইস্কুই - বর্তমান সময়টি কি সর্বদা আগের সময়ের চেয়ে বড় সংখ্যা নয় ? আমি মনে করি elapsed = time.time() - tএটি সেই ফর্ম যা সর্বদা একটি ইতিবাচক মান দেয়।
স্কট স্মিথ

32

মতলব থেকে অজগরে পাড়ি জমানোর সময় আমারও একই প্রশ্ন ছিল। এই থ্রেডের সাহায্যে আমি মতলব এবং ফাংশনগুলির একটি সঠিক এনালগ তৈরি করতে সক্ষম হয়েছিল । আপনার স্ক্রিপ্টের শীর্ষে কেবল নীচের কোডটি সন্নিবেশ করান।tic()toc()

import time

def TicTocGenerator():
    # Generator that returns time differences
    ti = 0           # initial time
    tf = time.time() # final time
    while True:
        ti = tf
        tf = time.time()
        yield tf-ti # returns the time difference

TicToc = TicTocGenerator() # create an instance of the TicTocGen generator

# This will be the main function through which we define both tic() and toc()
def toc(tempBool=True):
    # Prints the time difference yielded by generator instance TicToc
    tempTimeInterval = next(TicToc)
    if tempBool:
        print( "Elapsed time: %f seconds.\n" %tempTimeInterval )

def tic():
    # Records a time in TicToc, marks the beginning of a time interval
    toc(False)

এটাই! এখন আমরা সম্পূর্ণরূপে ব্যবহার করার জন্য প্রস্তুত tic()এবং toc()মাত্র মতলব হিসেবে। উদাহরণ স্বরূপ

tic()

time.sleep(5)

toc() # returns "Elapsed time: 5.00 seconds."

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

TicToc2 = TicTocGenerator() # create another instance of the TicTocGen generator

def toc2(tempBool=True):
    # Prints the time difference yielded by generator instance TicToc2
    tempTimeInterval = next(TicToc2)
    if tempBool:
    print( "Elapsed time 2: %f seconds.\n" %tempTimeInterval )

def tic2():
    # Records a time in TicToc2, marks the beginning of a time interval
    toc2(False)

এখন আপনার দুটি পৃথক জিনিস সময় সাধ্যের যোগ্য হওয়া উচিত: নিম্নলিখিত উদাহরণে আমরা মোট স্ক্রিপ্ট এবং স্ক্রিপ্টের অংশগুলি আলাদাভাবে আলাদাভাবে সময় করি।

tic()

time.sleep(5)

tic2()

time.sleep(3)

toc2() # returns "Elapsed time 2: 5.00 seconds."

toc() # returns "Elapsed time: 8.00 seconds."

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

tic()

time.sleep(1)

toc() # returns "Elapsed time: 1.00 seconds."

time.sleep(2)

toc() # returns "Elapsed time: 2.00 seconds."

time.sleep(3)

toc() # returns "Elapsed time: 3.00 seconds."

# and so on...

আমি আশা করি এটি সহায়ক।


22

টিক এবং টকের নিখুঁত সেরা অ্যানালগ হ'ল অজগরগুলিতে কেবল তাদের সংজ্ঞা দেওয়া।

def tic():
    #Homemade version of matlab tic and toc functions
    import time
    global startTime_for_tictoc
    startTime_for_tictoc = time.time()

def toc():
    import time
    if 'startTime_for_tictoc' in globals():
        print "Elapsed time is " + str(time.time() - startTime_for_tictoc) + " seconds."
    else:
        print "Toc: start time not set"

তারপরে আপনি এগুলি হিসাবে ব্যবহার করতে পারেন:

tic()
# do stuff
toc()

6
নেস্টেড ব্যবহারের ক্ষেত্রে ticএবং tocযা মাতলাব সমর্থন করে সে ক্ষেত্রে এটি সঠিকভাবে আচরণ করবে না । আরও কিছুটা পরিশীলনের দরকার পড়বে।
স্টেফান

2
যখন আমার কিছু বেসিক সময় প্রয়োজন হয় আমি নিজের কোডে অনুরূপ ফাংশন প্রয়োগ করেছি। তবে আমি import timeউভয় ফাংশনের বাইরের অংশটি সরিয়ে ফেলব , কারণ এটি বেশ কিছুটা সময় নিতে পারে।
বাস সুইঙ্কস

যদি আপনি এই কৌশলটি ব্যবহারের জন্য জোর দিয়ে থাকেন এবং নেস্টেড টিক / টোক পরিচালনা করতে আপনার এটির প্রয়োজন হয়, বিশ্বব্যাপী একটি তালিকা তৈরি করুন এবং ticএটিতে চাপ দিন এবং tocসেখান থেকে পপ করুন।
আহমেদ ফসিহ

1
এছাড়াও আমি অন্য কোথাও পড়েছি যা এর timeit.default_timer()চেয়ে ভাল time.time()কারণ time.clock()ওএসের উপর নির্ভর করে আরও উপযুক্ত হতে পারে
মিগুয়েল

@ আহমেদফ্যাসিহ আমার উত্তরটি এটাই দেয়, যদিও আরও কিছু জিনিস উন্নতি করা যেতে পারে।
অ্যান্টনিমো

15

সাধারণত, IPython এর %time, %timeit, %prunএবং %lprun(যদি এক হয়েছে line_profilerইনস্টল করা আছে) আমার প্রোফাইলিং চাহিদা বেশ ভাল সন্তুষ্ট। যাইহোক, tic-tocআমি যখন কোনও জিইআইআইতে ব্যবহারকারীর মাউস মোশন দ্বারা ইন্টারেক্টিভভাবে চালিত গণনাগুলি প্রোফাইল করার চেষ্টা করতাম তখন পছন্দ-মত কার্যকারিতার জন্য একটি ব্যবহারের কেস তৈরি হয় । আমি উত্সগুলিতে স্প্যামিং ticএস এবং এসের মতো অনুভব করেছি tocযখন ইন্টারেক্টিভভাবে পরীক্ষা করা হ'ল বাধাগুলি প্রকাশ করার দ্রুততম উপায়। আমি এলি বেন্ডারস্কির Timerক্লাসে গিয়েছিলাম , তবে পুরোপুরি খুশি ছিলাম না, যেহেতু এটিতে আমার কোডের ইনডেন্টেশনটি পরিবর্তন করা দরকার যা কিছু সম্পাদকের ক্ষেত্রে অসুবিধে হতে পারে এবং সংস্করণ নিয়ন্ত্রণ ব্যবস্থাটিকে বিভ্রান্ত করতে পারে। তদ্ব্যতীত, বিভিন্ন ফাংশনগুলির পয়েন্টগুলির মধ্যে সময়টি পরিমাপ করার প্রয়োজন হতে পারে, যা এর সাথে কাজ করে নাwithবিবৃতি। প্রচুর পাইথন চতুরতার চেষ্টা করার পরে, আমি এখানে সবচেয়ে সহজ সমাধানটি পেয়েছি যেটি সবচেয়ে ভালভাবে কাজ করেছে:

from time import time
_tstart_stack = []

def tic():
    _tstart_stack.append(time())

def toc(fmt="Elapsed: %s s"):
    print fmt % (time() - _tstart_stack.pop())

যেহেতু এটি স্ট্যাকের শুরুর সময়গুলিকে চাপ দিয়ে কাজ করে, তাই এটি একাধিক স্তরের tictocস এর জন্য সঠিকভাবে কাজ করবে । এটি tocঅতিরিক্ত তথ্য প্রদর্শনের জন্য একজনকে বিবৃতিটির ফর্ম্যাট স্ট্রিং পরিবর্তন করতে দেয় যা আমি এলির Timerক্লাস সম্পর্কে পছন্দ করি ।

কোনও কারণে আমি খাঁটি পাইথন বাস্তবায়নের ওভারহেড নিয়ে উদ্বিগ্ন হয়েছি, তাই আমি সি সি এক্সটেনশন মডিউলটিও পরীক্ষা করেছি:

#include <Python.h>
#include <mach/mach_time.h>
#define MAXDEPTH 100

uint64_t start[MAXDEPTH];
int lvl=0;

static PyObject* tic(PyObject *self, PyObject *args) {
    start[lvl++] = mach_absolute_time();
    Py_RETURN_NONE;
}

static PyObject* toc(PyObject *self, PyObject *args) {
return PyFloat_FromDouble(
        (double)(mach_absolute_time() - start[--lvl]) / 1000000000L);
}

static PyObject* res(PyObject *self, PyObject *args) {
    return tic(NULL, NULL), toc(NULL, NULL);
}

static PyMethodDef methods[] = {
    {"tic", tic, METH_NOARGS, "Start timer"},
    {"toc", toc, METH_NOARGS, "Stop timer"},
    {"res", res, METH_NOARGS, "Test timer resolution"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
inittictoc(void) {
    Py_InitModule("tictoc", methods);
}

এটি ম্যাকোএসএক্সের জন্য, এবং আমি ব্রেভিটির lvlসীমা ছাড়িয়ে গেছে কিনা তা পরীক্ষা করতে কোড বাদ দিয়েছি । যদিও tictoc.res()উৎপাদনের আমার সিস্টেম 50 সম্পর্কে ন্যানোসেকেন্ড একটি রেজল্যুশন, আমি দেখেছি যে কোনো পাইথন বিবৃতি পরিমাপ নার্ভাসভাবে (যখন IPython থেকে ব্যবহার এবং আরো অনেক কিছু) মাইক্রোসেকেন্ড সীমার মধ্যে সহজে হয়। এই মুহুর্তে, পাইথন বাস্তবায়নের ওভারহেড উপেক্ষিত হয়ে যায়, যাতে এটি সি বাস্তবায়নের মতো একই আত্মবিশ্বাসের সাথে ব্যবহার করা যায়।

আমি দেখতে পেয়েছি যে tic-toc-অপ্রোচটির কার্যকারিতা কার্যত কেবল কোড ব্লকের মধ্যে সীমাবদ্ধ যা কার্যকর করতে 10 টিরও বেশি মাইক্রোসেকেন্ড নেয়। এর নীচে, গড় কৌশলগুলি যেমন timeitবিশ্বস্ত পরিমাপ করা প্রয়োজন।


1
অত্যন্ত মার্জিত, @ স্টেফান - এটি এত কম রেট দেওয়া বিশ্বাস করতে পারে না। ধন্যবাদ!
thclark

10

আপনি ব্যবহার করতে পারেন ticএবং tocথেকে ttictoc। এটি দিয়ে ইনস্টল করুন

pip install ttictoc

এবং কেবল তাদের অনুসরণ হিসাবে আপনার স্ক্রিপ্ট এ আমদানি করুন

from ttictoc import tic,toc
tic()
# Some code
print(toc())

8

নেস্টেড টিক টোকস অর্জনের জন্য আমি একটি মডিউল [tictoc.py] তৈরি করেছি, যা মাতলাবই করে।

from time import time

tics = []

def tic():
    tics.append(time())

def toc():
    if len(tics)==0:
        return None
    else:
        return time()-tics.pop()

এবং এটি এইভাবে কাজ করে:

from tictoc import tic, toc

# This keeps track of the whole process
tic()

# Timing a small portion of code (maybe a loop)
tic()

# -- Nested code here --

# End
toc()  # This returns the elapse time (in seconds) since the last invocation of tic()
toc()  # This does the same for the first tic()

আমি আসা করি এটা সাহায্য করবে.


ম্যাটল্যাব থেকে টিক / টকের দুর্দান্ত প্রতিলিপি!
ম্যাট

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

3

কটাক্ষপাত আছে timeitমডিউল। এটি আসলে সমতুল্য নয় তবে আপনি যে কোডটি সময় দিতে চান তা যদি কোনও ফাংশনের অভ্যন্তরে থাকে তবে আপনি সহজেই এটি ব্যবহার করতে পারেন।


হ্যাঁ, timeitমানদণ্ডের জন্য সেরা is এটি এমনকি একটি ফাংশন হতে হবে না, আপনি অস্বাভাবিক জটিল বিবৃতি পাস করতে পারেন।

10
ওয়েল, পাসিং কোড যা একটি স্ট্রিং হিসাবে অত্যন্ত সাধারণ ফাংশন কল নয় খুব কুৎসিত।
চোরমাস্টার


1

এটি একটি মোড়ক ব্যবহার করেও করা যেতে পারে। সময় রাখার খুব সাধারণ উপায়।

এই উদাহরণ কোডের মোড়ক কোনও ফাংশন মুড়িয়ে দেয় এবং ফাংশনটি সম্পাদন করতে প্রয়োজনীয় সময় প্রিন্ট করে:

def timethis(f):
    import time

    def wrapped(*args, **kwargs):
        start = time.time()
        r = f(*args, **kwargs)
        print "Executing {0} took {1} seconds".format(f.func_name,  time.time()-start)
        return r
    return wrapped

@timethis
def thistakestime():
    for x in range(10000000):
        pass

thistakestime()

মোড়কের ফাংশন, টাইমথিসকে ডেকরেটার বলা হয়। আরও কিছু বিশদ বিশদ ব্যাখ্যা, এখানে: मध्यम.com
মিরেসিয়া

1

__init__()টাইমিংয়ের __del__()জন্য কর্টর এবং ডটর ব্যবহার করার জন্য আমি @ এলি বেন্ডারস্কির উত্তরটি কিছুটা বদলেছি , যাতে মূল কোডটি ইন্ডেন্ট না করে এটিকে আরও সহজেই ব্যবহার করা যায়:

class Timer(object):
    def __init__(self, name=None):
        self.name = name
        self.tstart = time.time()

    def __del__(self):
        if self.name:
            print '%s elapsed: %.2fs' % (self.name, time.time() - self.tstart)
        else:
            print 'Elapsed: %.2fs' % (time.time() - self.tstart)

ব্যবহার করতে, কিছু স্থানীয় সুযোগের শুরুতে সরল টাইমার ("ব্লেব্লাহ") রাখুন। বিচ্ছিন্ন সময় স্কোপের শেষে মুদ্রণ করা হবে:

for i in xrange(5):
    timer = Timer("eigh()")
    x = numpy.random.random((4000,4000));
    x = (x+x.T)/2
    numpy.linalg.eigh(x)
    print i+1
timer = None

এটি মুদ্রণ করে:

1
eigh() elapsed: 10.13s
2
eigh() elapsed: 9.74s
3
eigh() elapsed: 10.70s
4
eigh() elapsed: 10.25s
5
eigh() elapsed: 11.28s

3
এই বাস্তবায়ন সংক্রান্ত একটি সমস্যা হ'ল সত্য, timerএটি শেষ কলের পরে মুছে ফেলা হয় না, যদি forলুপের পরে অন্য কোনও কোড অনুসরণ করে । শেষ টাইমার মান পেতে, লুপের timerপরে মুছে ফেলা বা ওভাররাইট করা উচিত for, যেমন মাধ্যমে timer = None
বাসস্টল্ফ

1
@ বাসস্টেল্পল্প ঠিক বুঝতে পেরেছেন যে আপনি কী বোঝাতে চেয়েছিলেন তা আমি ভুল বুঝেছি ... আপনার পরামর্শটি এখন কোডটিতে সংযুক্ত করা হয়েছে। ধন্যবাদ।
শাওহুয়া লি

1

পাইথন 3-এ এলির উত্তর আপডেট করা :

class Timer(object):
    def __init__(self, name=None, filename=None):
        self.name = name
        self.filename = filename

    def __enter__(self):
        self.tstart = time.time()

    def __exit__(self, type, value, traceback):
        message = 'Elapsed: %.2f seconds' % (time.time() - self.tstart)
        if self.name:
            message = '[%s] ' % self.name + message
        print(message)
        if self.filename:
            with open(self.filename,'a') as file:
                print(str(datetime.datetime.now())+": ",message,file=file)

এলির মতোই, এটি একটি প্রসঙ্গ পরিচালক হিসাবেও ব্যবহার করা যেতে পারে:

import time 
with Timer('Count'):
    for i in range(0,10_000_000):
        pass

আউটপুট:

[Count] Elapsed: 0.27 seconds

আমি রিপোর্টকৃত সময়ের এককগুলি (সেকেন্ড) মুদ্রণ করতে এবং ক্যানের পরামর্শ অনুসারে অঙ্কের সংখ্যা ছাঁটাতে এবং লগ ফাইলটিতে যুক্ত করার বিকল্প সহ এটি আপডেট করেছি updated লগিং বৈশিষ্ট্যটি ব্যবহার করতে আপনাকে অবশ্যই ডেটটাইম আমদানি করতে হবে:

import time
import datetime 
with Timer('Count', 'log.txt'):    
    for i in range(0,10_000_000):
        pass

0

স্টিফান এবং অ্যান্টোনিমমোর জবাবগুলির ভিত্তিতে বিল্ডিং আমি শেষ করছি

def Tictoc():
    start_stack = []
    start_named = {}

    def tic(name=None):
        if name is None:
            start_stack.append(time())
        else:
            start_named[name] = time()

    def toc(name=None):
        if name is None:
            start = start_stack.pop()
        else:
            start = start_named.pop(name)
        elapsed = time() - start
        return elapsed
    return tic, toc

একটি utils.pyমডিউলে, এবং আমি এটি দিয়ে ব্যবহার করি

from utils import Tictoc
tic, toc = Tictoc()

এই পথে

  • আপনি সহজভাবে ব্যবহার করতে পারেন tic(),toc() এবং নীড় তাদের মতলব ভালো লাগে
  • অন্যথা, আপনি এগুলির নাম করতে পারেন: tic(1), toc(1)বা tic('very-important-block'),toc('very-important-block') এবং বিভিন্ন নামের সাথে টাইমার হস্তক্ষেপ করবে না
  • এগুলি এগুলি আমদানি এটি ব্যবহার করে মডিউলগুলির মধ্যে হস্তক্ষেপ রোধ করে।

(এখানে টোকটি অতিবাহিত সময় প্রিন্ট করে না, তবে এটি প্রদান করে))

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