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.
% timeit -n 10 -r 100 test ()
?Mit anderen Worten, es gibt ** den schnellsten Durchschnitt von 10 Stück **.
- 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
.
├── utils
│ ├── speed_test.py
│ └── __init__.py
└── main.py
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)
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()
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
Recommended Posts