Sök…


%% timeit och% timeit i IPython

Profilering av strängbeton:

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 av slingor över iterables och listor:

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

Profilering av upprepning av element i en matris

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

timeit kommandorad

Profilering av sammansättning av siffror

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 i kommandoraden

Källkoden med @profile-direktivet före den funktion vi vill profilera:

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

Med hjälp av kernprof-kommandot för att beräkna profilering rad för rad

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

Sidförfrågan är nästan alltid långsammare än någon beräkning baserad på informationen på sidan.

Använda cProfile (Preferred Profiler)

Python innehåller en profil som heter cProfile. Detta är vanligtvis att föredra framför användning av timeit.

Det delar ner hela skriptet och för varje metod i ditt skript berättar det för dig:

  • ncalls : Antalet gånger en metod kallades
  • tottime : Total tid tillbringad i den givna funktionen (exklusive tid gjord i samtal till underfunktioner)
  • percall : percall per samtal. Eller kvotienten på tottime dividerat med ncalls
  • cumtime : Den kumulativa tiden som spenderas i detta och alla underfunktioner (från anrop till utgång). Denna siffra är korrekt även för rekursiva funktioner.
  • percall : är kvoten på cumtime dividerat med primitiva samtal
  • filename:lineno(function) : ger respektive data för respektive funktion

CProfiler kan enkelt anropas på kommandoraden med:

$ python -m cProfile main.py 

Så här sorterar du den returnerade listan med profilerade metoder efter den tid som tagits i metoden:

$ python -m cProfile -s time main.py 


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow