Как измерить скорость функции питона
Я обычно пишу коды (функции) на сайте www.codefights.com в качестве конкурента. Поэтому скорость - одна из важных частей кода. Как я могу измерить скорость определенного кода на языке Python, будь то лямбда-функция или функция определения.
5 ответов
В 3 шага;)
Шаг 1: установить line_profiler
pip install line_profiler
Шаг 2: Добавить @profile
к вашему коду:
from time import sleep
@profile
def so_slow(bar):
sleep(5)
return bar
if __name__ == "__main__":
so_slow(5)
Шаг 3: Проверьте свой код:
kernprof -l -v your_code.py
Результат
Wrote profile results to your_code.py.lprof
Timer unit: 1e-06 s
Total time: 5.00283 s
File: your_code.py
Function: so_slow at line 4
Line # Hits Time Per Hit % Time Line Contents
==============================================================
4 @profile
5 def so_slow(bar):
6 1 5002830 5002830.0 100.0 sleep(5)
7 1 2 2.0 0.0 return bar
memory_profiler
Ты можешь использовать memory_profiler
Также установите его, добавьте профиль и назовите его:
pip install memory_profiler
python -m memory_profiler your_code.py
Результат:
Filename: your_code.py
Line # Mem usage Increment Line Contents
================================================
4 21.289 MiB 0.000 MiB @profile
5 def so_slow(bar):
6 21.289 MiB 0.000 MiB sleep(5)
7 21.289 MiB 0.000 MiB return bar
Обновить:
Вы можете использовать objgraph, чтобы найти memory leak
или нарисуйте график своего кода:
from time import sleep
import objgraph
x = [1]
objgraph.show_backrefs([x], filename='sample-backref-graph.png')
def so_slow(bar):
sleep(5)
return bar
if __name__ == "__main__":
so_slow(5)
Результат:
Взгляните на модуль timeit в стандартной библиотеке pythons:
https://docs.python.org/2/library/timeit.html
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.5858950614929199
Чтобы предоставить модулю timeit доступ к определенным вами функциям, вы можете передать параметр настройки, который содержит оператор импорта:
def test():
"""Stupid test function"""
L = []
for i in range(100):
L.append(i)
if __name__ == '__main__':
import timeit
print(timeit.timeit("test()", setup="from __main__ import test"))
Например:
import timeit
def a():
return 1+1
print timeit.timeit(a, number=1000000)
Вы можете использовать его в ipython и использовать% времени, чтобы увидеть время выделения, необходимое для выполнения функции:
In [1]: def function(a,b):
...: return a+b
...:
In [2]: %time function(1, 2)
CPU times: user 5 µs, sys: 0 ns, total: 5 µs
Wall time: 9.06 µs
Out[2]: 3
Обычно я полагаюсь на следующее, когда мне нужно измерить время выполнения какой-то очень специфической части кода:
https://docs.python.org/3/library/time.html
def howLong():
startTime = time.time()
time.sleep(3)
print("Time to wake up, ~3 seconds have passed!")
endTime = time.time()
howMuchTime = endTime - startTime
print(str(howMuchTime) + " sec")
if __name__ == '__main__':
import time
howLong()
Результат
Time to wake up, ~3 seconds have passed!
3.013692855834961 sec