There are a few different ways to profile a Python application. Profiling means having the application run while keeping track of several different parameters, like the number of times a function is called, the amount of time spent inside it, and so on. Profiling can help us find the bottlenecks in our application, so that we can improve only what is really slowing us down.
If you take a look at the profiling section in the standard library official documentation, you will see that there are a couple of different implementations of the same profiling interface:
cProfileis recommended for most users, it's a C extension with reasonable overhead that makes it suitable for profiling long-running programs