Szukaj…


%% timeit i% timeit w IPython

Profilowanie łańcuchów łańcuchowych:

In [1]: import string

In [2]: %%timeit s=""; long_list=list(string.ascii_letters)*50
  ....: for substring in long_list:
  ....:   s+=substring
  ....:
1000 loops, best of 3: 570 us per loop

In [3]: %%timeit long_list=list(string.ascii_letters)*50
  ....: s="".join(long_list)
  ....:
100000 loops, best of 3: 16.1 us per loop

Profilowanie pętli w iteratach i listach:

In [4]: %timeit for i in range(100000):pass
100 loops, best of 3: 2.82 ms per loop

In [5]: %timeit for i in list(range(100000)):pass
100 loops, best of 3: 3.95 ms per loop

funkcja timeit ()

Profilowanie powtórzeń elementów w tablicy

>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576

linia poleceń timeit

Profilowanie konkatanacji liczb

python -m timeit "'-'.join(str(n) for n in range(100))"
10000 loops, best of 3: 29.2 usec per loop

python -m timeit "'-'.join(map(str,range(100)))"
100000 loops, best of 3: 19.4 usec per loop

line_profiler w linii poleceń

Kod źródłowy z dyrektywą @profile przed funkcją, którą chcemy profilować:

import requests

@profile
def slow_func():
    s = requests.session()
    html=s.get("https://en.wikipedia.org/").text
    sum([pow(ord(x),3.1) for x in list(html)])
        
for i in range(50):
    slow_func()

Użycie polecenia kernprof do obliczenia profilowania linia po linii

$ kernprof -lv so6.py

Wrote profile results to so6.py.lprof
Timer unit: 4.27654e-07 s

Total time: 22.6427 s
File: so6.py
Function: slow_func at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           @profile
     5                                           def slow_func():
     6        50        20729    414.6      0.0      s = requests.session()
     7        50     47618627 952372.5     89.9      html=s.get("https://en.wikipedia.org/").text
     8        50      5306958 106139.2     10.0      sum([pow(ord(x),3.1) for x in list(html)])

Żądanie strony jest prawie zawsze wolniejsze niż jakiekolwiek obliczenia oparte na informacjach na stronie.

Korzystanie z cProfile (Preferred Profiler)

Python zawiera profiler o nazwie cProfile. Jest to generalnie lepsze niż użycie timeit.

Rozkłada cały skrypt i dla każdej metody w skrypcie mówi:

  • ncalls : liczba ncalls metody
  • tottime : Całkowity czas spędzony w danej funkcji (z wyłączeniem czasu wykonanego w wywołaniach podfunkcji)
  • percall : czas spędzony na połączeniu. Lub iloraz czasu pracy podzielonego przez ncalls
  • cumtime : cumtime czas spędzony na tym i wszystkich podfunkcjach (od wywołania do wyjścia). Ta liczba jest dokładna nawet dla funkcji rekurencyjnych.
  • percall : iloraz cumtime podzielony przez prymitywne wywołania
  • filename:lineno(function) : zapewnia odpowiednie dane dla każdej funkcji

CProfiler można łatwo wywołać w wierszu poleceń, używając:

$ python -m cProfile main.py 

Aby posortować zwróconą listę metod profilowanych według czasu zajętego w metodzie:

$ python -m cProfile -s time main.py 


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow