Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to measure the speed of a python function

I usually write codes(functions) on www.codefights.com as a competitor.So speed is one of the important part of the code . How can i measure the speed of a certain code in python language whether it is the lambda function or a def function .

like image 874
Hissaan Ali Avatar asked Jun 21 '17 13:06

Hissaan Ali


People also ask

How does Python calculate run time?

The timeit() method of the timeit module can also be used to calculate the execution time of any program in python. The timeit() method accepts four arguments. Let's see what are these arguments: setup, which takes the code which runs before the execution of the main program, the default value is pass.

What are benchmarks in Python?

In Python, we have a by default module for benchmarking which is called timeit. With the help of the timeit module, we can measure the performance of small bit of Python code within our main program.


3 Answers

In 3 Step ;)

Step 1: install line_profiler

pip install line_profiler

Step 2: Add @profile to your code:

from time import sleep

@profile
def so_slow(bar):
    sleep(5)
    return bar

if __name__ == "__main__":
    so_slow(5)

Step 3: Test your code:

kernprof -l -v your_code.py

Result

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

You can use memory_profiler too, Install it, add profile and call it:

pip install memory_profiler
python -m memory_profiler your_code.py


Result:

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

Update:

You can use objgraph to find memory leak or draw a graph of your code:

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)


Result:

enter image description here

Reference : A guide to analyzing Python performance

like image 144
RaminNietzsche Avatar answered Oct 05 '22 14:10

RaminNietzsche


Have a look at the timeit module in pythons standard libaray:

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

To give the timeit module access to functions you define, you can pass a setup parameter which contains an import statement:

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"))
like image 15
Mandraenke Avatar answered Oct 05 '22 16:10

Mandraenke


For instance:

import timeit

def a():
    return 1+1

print timeit.timeit(a, number=1000000)
like image 13
Alexander Ejbekov Avatar answered Oct 05 '22 14:10

Alexander Ejbekov