الحصول على توقيت القراد في بايثون
سؤال
أنا فقط أحاول أن الوقت قطعة من التعليمات البرمجية.شبة الكود تبدو مثل:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
كيف تبدو في الثعبان ؟
وبشكل أكثر تحديدا, كيف يمكنني الحصول على عدد من القراد منذ منتصف الليل (أو ومع ذلك الثعبان ينظم هذا التوقيت)?
المحلول
في time
الوحدة, هناك نوعان من وظائف توقيت: time
و clock
. time
يمنحك "الجدار" الوقت, إذا كان هذا هو ما يهمك.
ومع ذلك ، فإن بيثون مستندات أقول clock
ينبغي أن تستخدم القياس.علما بأن clock
يتصرف مختلفة في أنظمة منفصلة:
- على مايكروسوفت ويندوز ، فإنه يستخدم الدالة Win32 QueryPerformanceCounter () ، مع "القرار عادة أفضل من جزء من الثانية".ليس له معنى خاص ، إنه مجرد رقم (يبدأ العد من أول مرة
clock
في عملية الخاص بك).
# ms windows t0= time.clock() do_something() t= time.clock() - t0 # t is wall seconds elapsed (floating point)
- على *نيكس ،
clock
التقارير الوقت وحدة المعالجة المركزية.الآن, هذا هو مختلفة, و على الأرجح القيمة التي تريدها ، لأن البرنامج لا يكاد أي وقت مضى هو فقط عملية طلب وقت وحدة المعالجة المركزية (حتى إذا كان لديك أي عمليات أخرى ، يستخدم نواة وحدة المعالجة المركزية في الوقت من الآن وحتى ذلك الحين).حتى هذا العدد ، الذي عادة smaller1 من جدار الزمن (أيالوقت.الوقت() - t0) هو أكثر وضوحا عند مقارنة كود:
# linux t0= time.clock() do_something() t= time.clock() - t0 # t is CPU seconds elapsed (floating point)
وبصرف النظر عن كل ذلك ، مرةلا وحدة لديه Timer
الفئة التي من المفترض أن تستخدم ما هو أفضل القياس من خلال وظيفة متاحة.
1 إلا خيوط يحصل في الطريق...
2 بيثون ≥3.3:هناك time.perf_counter()
و time.process_time()
. perf_counter
يستخدم من قبل timeit
وحدة نمطية.
نصائح أخرى
ما تحتاجه هو وظيفة من وحدة time()
time
:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
ويمكنك استخدام timeit وحدة لمزيد من الخيارات بالرغم من ذلك.
وهنا الحل الذي بدأت باستخدام مؤخرا:
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
ويمكنك استخدام مثل هذا (تحتاج ما لا يقل عن 2.5 بايثون):
with Timer():
do_long_code()
عند انتهاء التعليمات البرمجية، الموقت يطبع تلقائيا من وقت التشغيل. حلو! إذا أنا أحاول بسرعة مقاعد البدلاء شيء في بيثون مترجم، وهذا هو أسهل طريقة للذهاب.
وهنا تطبيق عينة من "الآن" و "format_delta"، ويشعر على الرغم تتردد في استخدام المفضل لديك توقيت وتنسيق الأسلوب.
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
واسمحوا لي أن أعرف إذا كان لديك طريقة التنسيق المفضل، أو إذا كان هناك طريقة أسهل أن تفعل كل هذا!
حدة الوقت في بيثون يتيح لك الوصول إلى الساعة () وظيفة، والتي ترجع الوقت بالثواني كنقطة العائمة.
سوفوالنظم المختلفة لها دقة مختلفة استنادا إلى الإعداد الساعة الداخلية الخاصة بهم (القراد في الثانية) لكنه عموما على الأقل في ظل 20milliseconds، وفي بعض الحالات أفضل من بضعة ميكروثانية.
و-Adam
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
ومن منتصف الليل:
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
إذا كان لديك العديد من البيانات التي تريد لآخر، هل يمكن استخدام شيء من هذا القبيل:
class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
وبعد التعليمة البرمجية الخاصة بك يمكن أن تبدو مثل:
tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
وبهذه الطريقة لا تحتاج لكتابة t = time()
قبل كل كتلة و1000 * (time() - t)
بعد ذلك، في حين لا تزال تحتفظ بالسيطرة على التنسيق (على الرغم من أنك يمكن بسهولة وضع ذلك في Ticket
جدا).
وانها مكسب ضئيل، ولكن اعتقد انها نوع من مريحة.