Zoeken…


%% timeit en% timeit in IPython

Profilering string concatanation:

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

Profilering van loops over iterables en lijsten:

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

timeit () functie

Profilering van herhaling van elementen in een array

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

timeit-opdrachtregel

Profilering van getallen

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 in opdrachtregel

De broncode met @profile-instructie vóór de functie die we willen profileren:

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()

Gebruik kernprof commando om profilering regel voor regel te berekenen

$ 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)])

Paginaverzoek is bijna altijd langzamer dan elke berekening op basis van de informatie op de pagina.

CProfile gebruiken (Preferred Profiler)

Python bevat een profiler genaamd cProfile. Dit heeft over het algemeen de voorkeur boven het gebruik van timeit.

Het splitst je hele script op en voor elke methode in je script vertelt het je:

  • ncalls : het aantal keren dat een methode werd aangeroepen
  • tottime : totale tijd doorgebracht in de gegeven functie (exclusief de tijd die is gemaakt in oproepen naar subfuncties)
  • percall : tijd besteed per oproep. Of het quotiënt van tottime gedeeld door ncalls
  • cumtime : de cumulatieve tijd doorgebracht in deze en alle subfuncties (van aanroep tot exit). Dit cijfer is nauwkeurig, zelfs voor recursieve functies.
  • percall : is het quotiënt van cumtime gedeeld door primitieve aanroepen
  • filename:lineno(function) : geeft de respectieve gegevens van elke functie

De cProfiler kan eenvoudig op de opdrachtregel worden opgeroepen met:

$ python -m cProfile main.py 

De geretourneerde lijst met geprofileerde methoden sorteren op de tijd die in de methode nodig is:

$ python -m cProfile -s time main.py 


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow