মতলবের টিক এবং টোক ফাংশনের পাইথন সমতুল্য কী ?
tic = timeit.default_timer(); (U,S,V) = np.linalg.svd(A); toc = timeit.default_timer()
, উদাহরণস্বরূপ: তারপরে print toc-tic
।
মতলবের টিক এবং টোক ফাংশনের পাইথন সমতুল্য কী ?
tic = timeit.default_timer(); (U,S,V) = np.linalg.svd(A); toc = timeit.default_timer()
, উদাহরণস্বরূপ: তারপরে print toc-tic
।
উত্তর:
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
- এটি সমস্ত কি আপনি পরিমাপ করতে চান তার উপর নির্ভর করে।
time
সর্বদা জন্য প্রোগ্রামগুলির রানটাইম পরিমাপ করতে ইউনিক্স কমান্ডটি ব্যবহার করে আসছে এবং এই পদ্ধতিটি পাইথন কোডের অভ্যন্তরে এটি প্রতিলিপি করে। আমি এতে কোনও ভুল দেখছি না, যতক্ষণ না এটি কাজের সঠিক হাতিয়ার। timeit
সর্বদা তা নয়, এবং একজন প্রোফাইলার বেশিরভাগ প্রয়োজনের জন্য অনেক বেশি ভারী
print 'Elapsed: %.2f seconds % (time.time() - self.tstart)'
। এটি% .2f ছাড়া বোঝা শক্ত। দুর্দান্ত ধারণা জন্য ধন্যবাদ।
elapsed = t - time.time()
পরিবর্তে elapsed = time.time() - t
। পরবর্তী সময়টি নেতিবাচক হবে। আমি এই পরিবর্তনটি সম্পাদনা হিসাবে প্রস্তাব করেছি।
elapsed = time.time() - t
এটি সেই ফর্ম যা সর্বদা একটি ইতিবাচক মান দেয়।
মতলব থেকে অজগরে পাড়ি জমানোর সময় আমারও একই প্রশ্ন ছিল। এই থ্রেডের সাহায্যে আমি মতলব এবং ফাংশনগুলির একটি সঠিক এনালগ তৈরি করতে সক্ষম হয়েছিল । আপনার স্ক্রিপ্টের শীর্ষে কেবল নীচের কোডটি সন্নিবেশ করান।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...
আমি আশা করি এটি সহায়ক।
টিক এবং টকের নিখুঁত সেরা অ্যানালগ হ'ল অজগরগুলিতে কেবল তাদের সংজ্ঞা দেওয়া।
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()
tic
এবং toc
যা মাতলাব সমর্থন করে সে ক্ষেত্রে এটি সঠিকভাবে আচরণ করবে না । আরও কিছুটা পরিশীলনের দরকার পড়বে।
import time
উভয় ফাংশনের বাইরের অংশটি সরিয়ে ফেলব , কারণ এটি বেশ কিছুটা সময় নিতে পারে।
tic
এটিতে চাপ দিন এবং toc
সেখান থেকে পপ করুন।
timeit.default_timer()
চেয়ে ভাল time.time()
কারণ time.clock()
ওএসের উপর নির্ভর করে আরও উপযুক্ত হতে পারে
সাধারণত, 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())
যেহেতু এটি স্ট্যাকের শুরুর সময়গুলিকে চাপ দিয়ে কাজ করে, তাই এটি একাধিক স্তরের tic
ও toc
স এর জন্য সঠিকভাবে কাজ করবে । এটি 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
বিশ্বস্ত পরিমাপ করা প্রয়োজন।
আপনি ব্যবহার করতে পারেন tic
এবং toc
থেকে ttictoc
। এটি দিয়ে ইনস্টল করুন
pip install ttictoc
এবং কেবল তাদের অনুসরণ হিসাবে আপনার স্ক্রিপ্ট এ আমদানি করুন
from ttictoc import tic,toc
tic()
# Some code
print(toc())
নেস্টেড টিক টোকস অর্জনের জন্য আমি একটি মডিউল [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()
আমি আসা করি এটা সাহায্য করবে.
কটাক্ষপাত আছে timeit
মডিউল। এটি আসলে সমতুল্য নয় তবে আপনি যে কোডটি সময় দিতে চান তা যদি কোনও ফাংশনের অভ্যন্তরে থাকে তবে আপনি সহজেই এটি ব্যবহার করতে পারেন।
timeit
মানদণ্ডের জন্য সেরা is এটি এমনকি একটি ফাংশন হতে হবে না, আপনি অস্বাভাবিক জটিল বিবৃতি পাস করতে পারেন।
pip install easy-tictoc
কোডে:
from tictoc import tic, toc
tic()
#Some code
toc()
দাবি অস্বীকার: আমি এই গ্রন্থাগারের লেখক।
এটি একটি মোড়ক ব্যবহার করেও করা যেতে পারে। সময় রাখার খুব সাধারণ উপায়।
এই উদাহরণ কোডের মোড়ক কোনও ফাংশন মুড়িয়ে দেয় এবং ফাংশনটি সম্পাদন করতে প্রয়োজনীয় সময় প্রিন্ট করে:
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()
__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
timer
এটি শেষ কলের পরে মুছে ফেলা হয় না, যদি for
লুপের পরে অন্য কোনও কোড অনুসরণ করে । শেষ টাইমার মান পেতে, লুপের timer
পরে মুছে ফেলা বা ওভাররাইট করা উচিত for
, যেমন মাধ্যমে timer = None
।
পাইথন 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
স্টিফান এবং অ্যান্টোনিমমোর জবাবগুলির ভিত্তিতে বিল্ডিং আমি শেষ করছি
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')
এবং বিভিন্ন নামের সাথে টাইমার হস্তক্ষেপ করবে না(এখানে টোকটি অতিবাহিত সময় প্রিন্ট করে না, তবে এটি প্রদান করে))
tic = time.time()
এবংtoc = time.time()
, তবে লোকেদেরprint toc-tic, 'sec Elapsed'
যেমন নীচে বলেছেন, তবেtimeit
এটি আরও দৃ rob়।