Chcę utworzyć funkcję Pythona, aby przetestować czas spędzony w każdej funkcji i wydrukować jej nazwę wraz z czasem, jak mogę wydrukować nazwę funkcji i jeśli jest inny sposób, aby to zrobić, powiedz mi
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
do pomiaru. Nie jest doskonały, ale zdecydowanie przebija twoje pchnięcie i jest o wiele łatwiejszy w użyciutimeit
niż samodzielne przygotowanie czegoś lepszego.Odpowiedzi:
Przede wszystkim zdecydowanie sugeruję użycie profilera lub przynajmniej użycie timeit .
Jeśli jednak chcesz napisać własną metodę pomiaru czasu, której dokładnie chcesz się nauczyć, tutaj jest miejsce, w którym możesz zacząć korzystać z dekoratora.
Python 2:
Użycie jest bardzo proste, wystarczy użyć dekoratora @timing:
Python 3:
Uwaga Dzwonię,
f.func_name
aby uzyskać nazwę funkcji jako ciąg (w Pythonie 2) lubf.__name__
w Pythonie 3.źródło
Po zabawie z
timeit
modułem nie podoba mi się jego interfejs, który nie jest tak elegancki w porównaniu do dwóch poniższych metod.Poniższy kod jest w języku Python 3.
Metoda dekoratora
To jest prawie to samo z metodą @ Mike'a. Tutaj dodaję
kwargs
ifunctools
zawijam, żeby było lepiej.Metoda menedżera kontekstu
Na przykład możesz go używać tak, jak:
Kod w
with
bloku będzie mierzony w czasie.Wniosek
Korzystając z pierwszej metody, możesz codziennie skomentować dekorator, aby uzyskać normalny kod. Jednak może tylko mierzyć czas funkcji. Jeśli masz jakąś część kodu, której nie możesz uczynić z funkcji, możesz wybrać drugą metodę.
Na przykład teraz masz
Teraz chcesz ustawić czas na
bigImage = ...
linii. Jeśli zmienisz to na funkcję, będzie to:Wygląda niezbyt dobrze ... A co jeśli jesteś w Pythonie 2, który nie ma
nonlocal
słowa kluczowego.Zamiast tego użycie drugiej metody pasuje tutaj bardzo dobrze:
źródło
timeit
interfejs i skorzystać zwraps()
funkcjifunctools
modułu. Chodzi mi o to, że cały ten dodatkowy kod nie jest potrzebny.import functools
Nie wiem w czym jest problem z
timeit
modułem. To prawdopodobnie najprostszy sposób na zrobienie tego.Możliwe jest również przesyłanie argumentów do funkcji. Wszystko, czego potrzebujesz, to otoczyć swoją funkcję dekoratorami. Więcej wyjaśnień tutaj: http://www.pythoncentral.io/time-a-python-function/
Jedynym przypadkiem, w którym możesz być zainteresowany pisaniem własnych instrukcji dotyczących czasu, jest to, że chcesz uruchomić funkcję tylko raz i chcesz również uzyskać jej wartość zwracaną.
Zaletą korzystania z
timeit
modułu jest to, że pozwala na powtórzenie liczby wykonań. Może to być konieczne, ponieważ inne procesy mogą wpływać na dokładność taktowania. Powinieneś więc uruchomić go wiele razy i spojrzeć na najniższą wartość.źródło
timeit.timeit(lambda: func(a,b,c), number=1)
? Używam tego podczas testowania hipotetycznego rozwiązania w terminalu.Timeit ma dwie duże wady: nie zwraca wartości zwracanej funkcji i używa funkcji eval, która wymaga przekazania dodatkowego kodu konfiguracyjnego do importu. To rozwiązuje oba problemy w prosty i elegancki sposób:
źródło
Istnieje proste narzędzie do pomiaru czasu. https://github.com/RalphMao/PyTimer
Może działać jak dekorator :
Wynik:
Może również działać jak zegar wtyczki z kontrolą przestrzeni nazw (przydatne, jeśli wstawiasz go do funkcji, która ma dużo kodów i może być wywołana gdziekolwiek indziej).
Wynik:
Mam nadzieję, że to pomoże
źródło
Metoda dekoratora przy użyciu biblioteki dekoratora w języku Python:
Zobacz post na moim blogu:
post na blogu mobilepro.pl
mój post w Google Plus
źródło
Mój sposób na zrobienie tego:
Ustaw zmienną tak jak
start = time()
przed wykonaniem funkcji / pętli iprintTime(start)
zaraz po bloku.i masz odpowiedź.
źródło