Как измерить скорость функции питона

Я обычно пишу коды (функции) на сайте 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)


Результат:

введите описание изображения здесь

Справка: руководство по анализу производительности Python

Взгляните на модуль 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
Другие вопросы по тегам