it-swarm.com.de

Holen Sie sich Timer-Ticks in Python

Ich versuche gerade, ein Stück Code zeitlich festzulegen. Der Pseudocode sieht folgendermaßen aus:

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

Wie sieht das in Python aus?

Genauer gesagt, wie bekomme ich die Anzahl der Ticks seit Mitternacht (oder wie auch immer Python dieses Timing organisiert)?

40
andrewrk

Im Modul time gibt es zwei Zeitsteuerungsfunktionen: time und clock. time gibt Ihnen "Wand" Zeit, wenn es Ihnen darum geht.

Der Python docs sagt jedoch, dass clock für das Benchmarking verwendet werden sollte. Beachten Sie, dass sich clock in separaten Systemen unterschiedlich verhält:

  • unter MS Windows wird die Win32-Funktion QueryPerformanceCounter () verwendet, deren Auflösung normalerweise besser ist als eine Mikrosekunde. Es hat keine besondere Bedeutung, es ist nur eine Zahl (es zählt beim ersten Aufruf von clock in Ihrem Prozess).
 # ms windows 
 t0 = Zeituhr () 
 etwas tun()
 t = time.clock () - t0 # t ist verstrichene Sekunden (Fließkommazahl) 
  • bei * nix meldet clock die CPU-Zeit. Nun ist dies anders und höchstwahrscheinlich der gewünschte Wert, da Ihr Programm kaum der einzige Prozess ist, der CPU-Zeit anfordert (selbst wenn Sie keine anderen Prozesse haben, verwendet der Kernel gelegentlich CPU-Zeit). Daher ist diese Zahl, die typischerweise kleiner ist als die Wandzeit (d. H. Time.time () - t0), sinnvoller beim Benchmarking-Code:
 # linux 
 t0 = Zeituhr () 
 etwas tun()
 t = Zeituhr () - t0 # t ist verstrichene CPU-Sekunden (Fließkommazahl) 

Darüber hinaus verfügt das Modul timeit über die Timer-Klasse, die das Beste aus der verfügbaren Funktionalität für das Benchmarking verwenden soll.

¹ Wenn das Einfädeln nicht in die Quere kommt…

² Python ≥3.3: Es gibt time.perf_counter() UND time.process_time() . perf_counter wird vom Modul timeit verwendet.

33
tzot

Was Sie brauchen, ist time() function aus dem Modul time:

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

Sie können jedoch timeit module für weitere Optionen verwenden.

30
blackwing

Hier ist eine Lösung, die ich kürzlich verwendet habe:

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

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

Sie verwenden es so (Sie benötigen mindestens Python 2.5):

with Timer():
    do_long_code()

Wenn der Code abgeschlossen ist, druckt der Timer die Laufzeit automatisch. Süss! Wenn ich versuche, im Python-Interpreter schnell etwas zu testen, ist dies der einfachste Weg. 

Und hier ist eine Beispielimplementierung von "now" und "format_delta". Sie können jedoch gerne Ihre bevorzugte Timing- und Formatierungsmethode 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, ob Sie eine bevorzugte Formatierungsmethode haben oder ob es einfacher ist, all dies zu tun!

4
leetNightshade
import datetime

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

Ab 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
2
Harley Holcombe

Mit dem Modul time module in python haben Sie Zugriff auf die clock () - Funktion, die die Zeit in Sekunden als Fließkomma zurückgibt.

Verschiedene Systeme weisen unterschiedliche Genauigkeit auf, abhängig von ihrer internen Takteinstellung (Ticks pro Sekunde), im Allgemeinen liegt sie jedoch unter mindestens 20 Millisekunden und in einigen Fällen besser als einige Mikrosekunden.

-Adam

2
Adam Davis

Wenn Sie viele Anweisungen zur Zeit haben möchten, können Sie Folgendes 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 so 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 müssen Sie nicht t = time() vor jedem Block und 1000 * (time() - t) danach eingeben, während Sie weiterhin die Formatierung kontrollieren (obwohl Sie dies leicht in Ticket setzen könnten).

Es ist ein minimaler Gewinn, aber ich denke, dass es irgendwie bequem ist.

0
Mark