So verwenden Sie das Timeit-Modul

  • Ich verstehe das Konzept dessen, was timeit macht, aber ich bin nicht sicher, wie ich es in meinen Code implementieren kann.

    Wie kann ich zwei vergleichen? Funktionen, zB insertion_sort und tim_sort, mit timeit?

    01 July 2016
    BoshWashJohn Y
12 answers
  • Wenn Sie timeit in einer interaktiven Python-Sitzung verwenden möchten, gibt es zwei praktische Optionen:

    1. Verwenden Sie die IPython Shell. Es verfügt über die praktische Sonderfunktion %timeit:

       In [1]: def f(x):
         ...:     return x*x
         ...: 
      
      In [2]: %timeit for x in range(100): f(x)
      100000 loops, best of 3: 20.3 us per loop
       
    2. In einem Standard-Python-Interpreter Sie können auf Funktionen und andere Namen zugreifen, die Sie zuvor während der interaktiven Sitzung definiert haben, indem Sie sie aus __main__ in der Setup-Anweisung importieren:

       >>> def f(x):
      ...     return x * x 
      ... 
      >>> import timeit
      >>> timeit.repeat("for x in range(100): f(x)", "from __main__ import f",
                        number=100000)
      [2.0640320777893066, 2.0876040458679199, 2.0520210266113281]
       
    22 November 2011
    Sven Marnach
  • Der Weg timeit funktioniert, wenn Sie einmal Setup-Code ausführen und dann wiederholt eine Reihe von Anweisungen aufrufen. Wenn Sie die Sortierung testen möchten, ist daher einige Sorgfalt geboten, damit ein Durchlauf bei einer Direktsortierung den nächsten Durchlauf mit bereits sortierten Daten nicht beeinflusst (dies würde natürlich die Timsort glänzen wirklich, da sie am besten funktioniert, wenn die Daten bereits teilweise geordnet sind.

    Hier ein Beispiel, wie Sie einen Test für die Sortierung einrichten:

     >>> import timeit
    
    >>> setup = '''
    import random
    
    random.seed('slartibartfast')
    s = [random.random() for i in range(1000)]
    timsort = list.sort
    '''
    
    >>> print min(timeit.Timer('a=s[:]; timsort(a)', setup=setup).repeat(7, 1000))
    0.334147930145
     

    Beachten Sie, dass die Reihe von Anweisungen dies macht eine neue Kopie der unsortierten Daten bei jedem Durchlauf.

    Beachten Sie außerdem die Timing-Technik, wenn Sie die Messreihe sieben Mal ausführen und nur die beste Zeit einhalten - dies kann wirklich helfen, die Zeit zu reduzieren Messverzerrungen aufgrund anderer Prozesse, die auf Ihrem System ausgeführt werden.

    Dies sind meine Tipps für die korrekte Verwendung von Timeit. Hoffe das hilft: -)

    22 February 2015
    Fermi paradoxIanVS
  • Ich werde Sie in ein Geheimnis einweihen: Am besten verwenden Sie timeit in der Befehlszeile.

    In der Befehlszeile timeit führt eine korrekte statistische Analyse durch: Sie sagt Ihnen, wie lange der kürzeste Lauf gedauert hat. Das ist gut, weil alle Fehler im Timing positiv sind. Die kürzeste Zeit hat also den geringsten Fehler. Es gibt keine Möglichkeit, einen negativen Fehler zu erhalten, da ein Computer niemals schneller berechnen kann, als er berechnen kann!

    Die Befehlszeilenschnittstelle:

     %~> python -m timeit "1 + 2"
    10000000 loops, best of 3: 0.0468 usec per loop
     

    Das ist ziemlich einfach, oder?

    Sie können Folgendes einrichten:

     %~> python -m timeit -s "x = range(10000)" "sum(x)"
    1000 loops, best of 3: 543 usec per loop
     

    was auch nützlich ist!

    Wenn Sie mehrere Zeilen haben möchten, Sie können entweder die automatische Fortsetzung der Shell verwenden oder separate Argumente verwenden:

     %~> python -m timeit -s "x = range(10000)" -s "y = range(100)" "sum(x)" "min(y)"
    1000 loops, best of 3: 554 usec per loop
     

    Dadurch wird ein Setup von

     x = range(1000)
    y = range(100)
     

    und Zeiten

     sum(x)
    min(y)
     

    Wenn Sie längere Skripts wünschen, könnten Sie versucht sein, innerhalb eines Python-Skripts zu timeit zu wechseln. Ich schlage vor, das zu vermeiden, da die Analyse und das Timing auf der Kommandozeile einfach besser sind. Stattdessen entwickle ich meistens Shell-Skripte:

      SETUP="
    
     ... # lots of stuff
    
     "
    
     echo Minmod arr1
     python -m timeit -s "$SETUP" "Minmod(arr1)"
    
     echo pure_minmod arr1
     python -m timeit -s "$SETUP" "pure_minmod(arr1)"
    
     echo better_minmod arr1
     python -m timeit -s "$SETUP" "better_minmod(arr1)"
    
     ... etc
     

    Dies kann aufgrund der mehrfachen Initialisierungen etwas länger dauern. Aber normalerweise ist das keine große Sache.


    Aber was ist, wenn Sie möchten, dass timeit in Ihrem verwendet Modul?

    Nun, der einfache Weg ist:

     def function(...):
        ...
    
    timeit.Timer(function).timeit(number=NUMBER)
     

    und damit erhalten Sie kumulative ( nicht minimum!) Zeit, um diese Anzahl von Malen auszuführen.

    Um eine gute Analyse zu erhalten, verwenden Sie .repeat und nehmen Sie das Minimum:

     min(timeit.Timer(function).repeat(repeat=REPEATS, number=NUMBER))
     

    Sie sollten dies normalerweise mit functools.partial anstelle von lambda: ... bis kombinieren niedrigerer Aufwand. Sie könnten also Folgendes haben:

     from functools import partial
    
    def to_time(items):
        ...
    
    test_items = [1, 2, 3] * 100
    times = timeit.Timer(partial(to_time, test_items)).repeat(3, 1000)
    
    # Divide by the number of repeats
    time_taken = min(times) / 1000
     

    Sie können es auch tun :

     timeit.timeit("...", setup="from __main__ import ...", number=NUMBER)
     

    was Ihnen etwas näher an der Schnittstelle vom Befehl Linie, aber auf viel weniger kühle Weise. Die "from __main__ import ..."

    19 December 2017
    VeedracMartin Beckett
  • Wenn Sie zwei Codeblöcke / Funktionen schnell vergleichen möchten, können Sie Folgendes tun:

     import timeit
    
    start_time = timeit.default_timer()
    func1()
    print(timeit.default_timer() - start_time)
    
    start_time = timeit.default_timer()
    func2()
    print(timeit.default_timer() - start_time)
     
    08 April 2015
    zzart
  • Die einfachste Möglichkeit, Timeit zu verwenden, ist die Befehlszeile:

    Gegeben test.py :

     def InsertionSort(): ...
    def TimSort(): ...
     

    Laufzeiten wie folgt:

     % python -mtimeit -s'import test' 'test.InsertionSort()'
    % python -mtimeit -s'import test' 'test.TimSort()'
     
    16 March 2014
    unutbuSammi De Guzman
  •  # Генерация целых чисел
    
    def gen_prime(x):
        multiples = []
        results = []
        for i in range(2, x+1):
            if i not in multiples:
                results.append(i)
                for j in range(i*i, x+1, i):
                    multiples.append(j)
    
        return results
    
    
    import timeit
    
    # Засекаем время
    
    start_time = timeit.default_timer()
    gen_prime(3000)
    print(timeit.default_timer() - start_time)
    
    # start_time = timeit.default_timer()
    # gen_prime(1001)
    # print(timeit.default _ timer () - start_time) 
      
    02 April 2017
    David Webb
  • Für mich ist dies der schnellste Weg:

     import timeit
    def foo():
        print("here is my code to time...")
    
    
    timeit.timeit(stmt=foo, number=1234567)
     
    17 January 2018
    Rodrigo LagunaBenno
  • Das funktioniert hervorragend:

       python -m timeit -c "$(cat file_name.py)"
     
    21 July 2017
    Ohad Rubin
  • Mit

    können Sie in den folgenden Fällen dasselbe Wörterbuch einrichten und die Ausführungszeit testen.

    Das Setup-Argument legt im Wesentlichen das Wörterbuch fest

    Nummer soll den Code 1000000-mal ausführen. Nicht das Setup, sondern das stmt

    Wenn Sie das ausführen, können Sie feststellen, dass der Index viel schneller ist als erhalten. Sie können es mehrmals ausführen, um es anzuzeigen.

    Der Code versucht grundsätzlich, den Wert von c im Wörterbuch zu erhalten.

     [pre> import timeit
    
    print('Getting value of C by index:', timeit.timeit(stmt="mydict['c']", setup="mydict={'a':5, 'b':6, 'c':7}", number=1000000))
    print('Getting value of C by get:', timeit.timeit(stmt="mydict.get('c')", setup="mydict={'a':5, 'b':6, 'c':7}", number=1000000))
     

    Hier sind meine Ergebnisse, Ihre Ergebnisse werden abweichen.

    nach Index: 0.20900007452246427

    von get: 0.54841166886888

    26 September 2016
    Stryker
  • übergeben Sie einfach Ihren gesamten Code als Argument für die Zeitangabe:

     import timeit
    
    print(timeit.timeit("""
    
    limit = 10000
    prime_list = [i for i in range(2, limit+1)]
    
    for prime in prime_list:
        for elem in range(prime*2, max(prime_list)+1, prime):
            if elem in prime_list:
                prime_list.remove(elem)"""
    
    , number=10))
     
    04 October 2017
    tryptofan