Implementieren Sie in Python Ihren eigenen jupyter magic-Befehl% timeit, der für die Geschwindigkeitsmessung praktisch ist

Dinge die zu tun sind

Implementieren Sie so etwas wie% timeit in jupyter. Ich möchte den Rückgabewert davon als Variable verwenden.

ipynb


%timeit -n 10 -r 100 test()

Es gibt andere Optionen als "-n" und "-r", aber dieses Mal werden wir keine anderen als diese beiden implementieren.

Was machst du überhaupt mit % timeit -n 10 -r 100 test ()?

  1. Wiederholen Sie test () 100 Mal und geben Sie den Wert mit der schnellsten Ausführungsgeschwindigkeit zurück.
  2. Wiederholen Sie 1 10 Mal und nehmen Sie den Durchschnitt.

Mit anderen Worten, es gibt ** den schnellsten Durchschnitt von 10 Stück **.

Ist Zeit in der Standardbibliothek nutzlos?

  1. Wiederholen Sie test () 100 Mal und geben Sie den Wert mit der schnellsten Ausführungsgeschwindigkeit zurück.

↑ Gibt es dafür keine Methode? Vorerst werde ich versuchen, es selbst umzusetzen und zu studieren.

https://docs.python.org/ja/3/library/timeit.html

Verzeichnisaufbau

.
├── utils
│   ├── speed_test.py
│   └── __init__.py
└── main.py

Code

Modul

speed_test.py


import time


class Measurer(object):
    def mean_time(self, num=10):
        """
Ein Dekorateur, der den Durchschnitt der Ergebnisse der laufenden Anzahl von Zeiten zurückgibt.
        """
        def outer_wrapper(func):
            def wrapper(*args, **kwargs):
                fast_time_list = [func(*args, **kwargs) for _ in range(num)]
                mean = sum(fast_time_list) / len(fast_time_list)
                return mean
            return wrapper
        return outer_wrapper

    def fast_time(self, repeat=10):
        """
Der Mindestwert (die schnellste Ausführungsgeschwindigkeit) unter den wiederholten Ausführungen)Ein Dekorateur, der zurückkehrt.
        """
        def outer_wrapper(func):
            def wrapper(*args, **kwargs):
                result_list = [func(*args, **kwargs) for _ in range(repeat)]
                # print(result_list)
                min_time = min(result_list)
                # print(result_list)
                # print(min_time)
                return min_time
            return wrapper
        return outer_wrapper

    def onece_time(self, func):
        """
Ein Dekorator, der die Ausführungsgeschwindigkeit der als Argument übergebenen Funktion zurückgibt.
        """
        def wrapper(*args, **kwargs):
            # print('test start')
            start_time = time.time()
            func(*args, **kwargs)
            finish_time = time.time()
            elapsed_time = finish_time - start_time
            # print('elapsed_time => {:.10f}sec'.format(elapsed_time))
            # print('test finish')
            return elapsed_time
        return wrapper

    def execute(self, func, *args, num, repeat):
        """
        1.Berechnet den schnellsten Wert unter den wiederholten Ausführungen.
        2.Wiederholen Sie 1 num mal und geben Sie den Durchschnitt der num schnellsten Werte zurück.
        """
        @self.mean_time(num=num)
        @self.fast_time(repeat=repeat)
        @self.onece_time
        def _execute(fn, *args):
            return fn(*args)
        return _execute(func, *args)

Ausführungsdatei

main.py


from utils import speed_test


#Definieren Sie eine Messfunktion
def test(max_count):
    count = 0
    for _ in range(max_count):
        count += 1


def main():
    max_count = 100
    num = 10
    repeat = 100

    measurer = speed_test.Measurer()
    #Nach dem zweiten Argument können Sie mehrere Argumente mit variabler Länge übergeben
    result = measurer.execute(test, max_count, num=num, repeat=repeat)
    print('result -> {:.12f}'.format(result))


if __name__ == '__main__':
    main()

Zu visualisierendes Muster

Da der Rückgabewert genommen werden kann, ist es einfach zu visualisieren und zu vergleichen.

py:main.py


import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display

from utils import speed_test


def test1(str_list):
    """
Konvertieren Sie alle Elemente der Zeichenfolgenliste ① numerisch
    """
    int_list = [int(i) for i in str_list]


def test2(str_list):
    """
Konvertieren Sie alle Elemente der Zeichenfolgenliste ② numerisch
    """
    int_list = list(map(int, str_list))


def main():
    num = 10
    repeat = 100

    #String-Liste generieren
    str_list = [str(i) for i in range(10000)]
    # ['0', '1', '2', ... '9997', '9998', '9999']

    measurer = speed_test.Measurer()
    #Nach dem zweiten Argument können Sie mehrere Argumente mit variabler Länge übergeben
    result1 = measurer.execute(test1, str_list, num=num, repeat=repeat)
    result2 = measurer.execute(test2, str_list, num=num, repeat=repeat)
    # print('result -> {:.12f}'.format(result))

    df = pd.DataFrame({
        'for': [result1],
        'map': [result2]
    })

    display(df)

    x = ['for', 'map']
    y = [result1, result2]
    plt.bar(x, y)
    plt.show


if __name__ == '__main__':
    main()
for	        map
0.001499	0.00109

名称未設定.png

Recommended Posts

Implementieren Sie in Python Ihren eigenen jupyter magic-Befehl% timeit, der für die Geschwindigkeitsmessung praktisch ist
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
Linux ist in erster Linie so etwas
Überprüfen Sie, ob in Python externe Befehle vorhanden sind (z. B. `which`).
Ein Allzweckprogramm, das Linux-Befehlszeichenfolgen mit Python formatiert
Machen Sie so etwas wie einen Python-Interpreter mit Visual Studio Code
[Django] Eine Sammlung von Skripten, die für die Entwicklung geeignet sind
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
Eine kurze Zusammenfassung von Graphviz in Python (nur für Mac erklärt)
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Ein Programm, das bestimmt, ob eine in Python eingegebene Zahl eine Primzahl ist
Was in datetime neu ist, ist in Python 3 etwas nützlicher
Drücken Sie einen Befehl in Python (Windows)
So etwas wie JS setTimeout in Python
So etwas wie tail -f in Python
Python-E-Book-Zusammenfassung nützlich für die frei lesbare Datenanalyse
Code lesen von faker, einer Bibliothek, die Testdaten in Python generiert
Codelesen von Safe, einer Bibliothek zur Überprüfung der Kennwortstärke in Python