سؤال

أنا فقط أحاول أن الوقت قطعة من التعليمات البرمجية.شبة الكود تبدو مثل:

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 جدا).

وانها مكسب ضئيل، ولكن اعتقد انها نوع من مريحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top