Frage

Ich versuche nur zu Zeit ein Stück Code. Der Pseudo-Code wie folgt aussieht:

start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."

Wie sieht dies in Python?

Genauer gesagt, wie kann ich die Anzahl der Ticks seit Mitternacht bekommen (oder aber Python organisiert, dass Timing)?

War es hilfreich?

Lösung

Im time Modul gibt es zwei Zeitfunktionen: time und clock. time gibt Ihnen „Wand“ Zeit, wenn das ist, was Ihnen wichtig sind.

Allerdings ist die Python docs sagen, dass clock sollte für das Benchmarking verwendet werden. Beachten Sie, dass clock anders in getrennten Systemen verhält:

  • auf MS Windows, verwendet es die Win32-Funktion Queryperformancecounter (), mit „Auflösung der Regel besser als eine Mikrosekunde“. Es hat keine besondere Bedeutung, es ist nur eine Zahl (es beginnt das erste Mal Zählen Sie clock in Ihrem Prozess nennen).
    # ms windows
    t0= time.clock()
    do_something()
    t= time.clock() - t0 # t is wall seconds elapsed (floating point)
  • auf * nichts, clock meldet CPU-Zeit. Nun, dies ist anders, und wahrscheinlich der Wert, den Sie wollen, da das Programm so gut wie nie der einzige Prozess ist CPU-Zeit anfordert (auch wenn Sie keine anderen Prozesse haben, verwendet die Kernel-CPU-Zeit von Zeit zu Zeit). Also, diese Zahl ist, die typischerweise smaller¹ als die Wand Zeit (das heißt time.time () - t0), ist sinnvoller, wenn der Code Benchmarking:
    # linux
    t0= time.clock()
    do_something()
    t= time.clock() - t0 # t is CPU seconds elapsed (floating point)

Neben all dem, das timeit Modul hat die Timer Klasse, die ist sollte verwenden, was das beste aus den verfügbaren Funktionen für das Benchmarking.

¹, es sei denn Einfädeln in die Quere kommt ...

² Python ≥3.3: Es gibt time.perf_counter() und time.process_time() . perf_counter wird durch das timeit Modul verwendet wird.

Andere Tipps

Was Sie brauchen, ist time() Funktion von time Modul:

import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."

Sie können mit timeit Modul für mehr Optionen though.

Hier ist eine Lösung, die ich vor kurzem begonnen mit:

class Timer:
    def __enter__(self):
        self.begin = now()

    def __exit__(self, type, value, traceback):
        print(format_delta(self.begin, now()))

Sie nutzen es so (Sie müssen mindestens Python 2.5):

with Timer():
    do_long_code()

Wenn Ihr Code beendet, Timer druckt automatisch die Laufzeit aus. Süss! Wenn ich zu schnell Bank etwas in der Python-Interpreter versucht, ist dies der einfachste Weg zu gehen.

Und hier ist ein Beispiel-Implementierung von ‚jetzt‘ und ‚format_delta‘, obwohl sich bitte an Ihren bevorzugten Timing und Formatierungsmethode zu verwenden.

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

Bitte lassen Sie mich wissen, wenn Sie eine bevorzugte Formatierungsmethode haben, oder wenn es einen einfacheren Weg, um all dies zu tun!

Die Zeitmodul in Python rel="nofollow können Sie auf die Uhr zugreifen () Funktion, die Zeit in Sekunden als Gleitkomma- zurückkehrt.

Verschiedene Systeme unterschiedliche Genauigkeit auf der Grundlage ihrer internen Uhr Setup haben (Ticks pro Sekunde), aber es ist in der Regel zumindest unter 20milliseconds, und in einigen Fällen besser als ein paar Mikrosekunden.

-Adam

import datetime

start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds

Von Mitternacht:

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

Wenn Sie viele Aussagen haben Sie Zeit möchten, können Sie so etwas wie diese verwenden:

class Ticker:
    def __init__(self):
        self.t = clock()

    def __call__(self):
        dt = clock() - self.t
        self.t = clock()
        return 1000 * dt

Dann könnte Ihr Code wie folgt aussehen:

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())

Auf diese Weise brauchen Sie nicht t = time() vor jedem Block und 1000 * (time() - t), nachdem es zu geben, während immer noch die Kontrolle über die Formatierung zu halten (obwohl man leicht, dass in Ticket setzen könnte auch).

Es ist ein minimaler Gewinn, aber ich denke, es ist eine Art bequem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top