Duke përdorur modulin timeit të bibliotekës standarde Python, mund të matni lehtësisht kohën e ekzekutimit të një procesi në kodin tuaj. Kjo është e dobishme për një kontroll të shpejtë.
Dy rastet e mëposhtme do të diskutohen këtu.
- Matni në një skedar Python:
timeit.timeit()
,timeit.repeat()
- Matja me fletore Jupyter:
%timeit
,%%timeit
Një mënyrë tjetër është përdorimi i time.time() për të matur kohën e kaluar në program.
Matjet në skedarët Python: timeit.timeit(), timeit.repeat()
Si shembull, do të matim kohën e përpunimit të një funksioni të thjeshtë, test(n), i cili llogarit shumën e n numrave të njëpasnjëshëm.
import timeit
def test(n):
return sum(range(n))
n = 10000
loop = 1000
result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842
Nëse ia kaloni kodin që dëshironi të matni si varg te funksioni timeit.timeit(), ai do të ekzekutohet NUMBER herë dhe koha që iu desh do të kthehet.
Vlera e paracaktuar për numrin është 1,000,000. Vini re se nëse përdorni vlerën e paracaktuar për një proces që kërkon shumë kohë, do të duhet shumë kohë.
Duke kaluar globals() si argument global, kodi do të ekzekutohet në hapësirën globale të emrave.
Pa këtë, testi i funksionit dhe ndryshorja n nuk njihen në shembullin e mësipërm.
Kodi që do të specifikohet mund të jetë një objekt i thirrshëm në vend të një vargu, kështu që mund të specifikohet si një shprehje lambda pa argumente; në këtë rast, argumenti globals nuk ka nevojë të specifikohet.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Njësia e rezultatit është sekonda. Këtu, rezultati është koha e përpunimit për ekzekutim, pjesëtuar me numrin e ekzekutimeve.
Nëse nuk e ndani, vlera e rezultatit thjesht do të bëhet më e madhe ndërsa rritni numrin e ekzekutimeve.
print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038
Duke përdorur funksionin timeit.repeat(), timeit() mund të ekzekutohet në mënyrë të përsëritur. Rezultati do të merret si një listë.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Matja me fletore Jupyter:%timeit, %%timeit
Në Jupyter Notebook (IPython), mund të përdorni komandat magjike të mëposhtme; nuk ka nevojë të importoni modulin timeit.
%timeit
%%timeit
%timeit
Në %timeit, specifikoni kodin e synuar të ndarë nga një hapësirë si argumentet e linjës së komandës.
Si parazgjedhje, numri dhe përsëritja në timeit.timeit() përcaktohen automatikisht. Ju gjithashtu mund t’i specifikoni ato me opsionet -n dhe -r.
Rezultatet llogariten si mesatare dhe devijim standard.
%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%%kohë
Komanda magjike %%timeit mund të përdoret për të matur kohën e përpunimit të një qelize të tërë.
Si shembull, le të ekzekutojmë të njëjtin proces duke përdorur NumPy. Opsionet -n dhe -r mund të hiqen.
Meqenëse matim kohën e përpunimit të të gjithë qelizës, shembulli i mëposhtëm përfshin kohën për të importuar NumPy.
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
Nuk ka nevojë të specifikoni kodin e synuar si argument për %%timeit. Gjithçka që duhet të bëni është të shkruani %%timeit në fillim të një qelize, kështu që është më e lehta për t’u përdorur.