python cprofile

Why Python cProfile is the Recommended Profiling Interface

Nirav Parmar Developer Tips, Tricks & Resources

Performance optimization is a basic need for software development. When it comes to optimizing app performance,  tracking frequency, maintaining production, or perpetuation method calls, profilers play a vital role. Learn why Python cProfile is a recommended profiling interface and how it enhances your software performance.

  • Python profiling  has three critical parts including:
  • Definition & explanation;
  • Tools  for a generic app developed using Python language;
  • APM (application performance monitoring) tools

New call-to-action

Python cProfile: Optimize Software Development Requirements

Statista report shows that Java and Python rank among the top five widely-used programming languages. When it comes to developing an app with Python, developers need to focus on the profiling interface  to improve project performance.

One way to improve Python application performance is through   cProfile. 

What is cProfile?

cProfile is an advanced library that  tracks functions to generate a list of the most often called functions. cProfile is beneficial to development because: :

1. Provides  a standard library;

2. Tracks different statistics call behavior;

3. Developers  can use cProfile without restrictions.

Simple cProfile Program Example:

from simul import benchmark

import cProfile

pr = cProfile.Profile()

pr.enable()

benchmark()

pr.disable()

pr.print_stats()

Code: (Source)

When you using cProfile you will output into five different columns, these includes:

  • ncalls: Ncalls indicate the number of times each function was called in the program.
  • tottime: Tottime shows the total time spent with the position before jumping  to another process.
  • cumtime: cumtime  indicates the time included to call other functions.
  • percall: Percall shows the total time spent for a single function call. It is obtained by dividing the number of calls by the  cumulative time.     

Short Program Explaining Use of Different Columns Usage in Python cProfile:

def factorial(n):

        if n == 0:

            return 1.0

        else:

            return n * factorial(n-1)

    def taylor_exp(n):

        return [1.0/factorial(i) for i in range(n)]

    def taylor_sin(n):

        res = []

        for i in range(n):

            if i % 2 == 1:

               res.append((-1)**((i-1)/2)/float(factorial(i)))

            else:

               res.append(0.0)

        return res

    def benchmark():

        taylor_exp(500)

        taylor_sin(500)

    if __name__ == ‘__main__’:

        benchmark()

Code: (Source)

Profiling with Python cProfile: Everything You Need to Know is Right Here!

Code profiling allows you to quickly  find bottlenecks in your code. Profiling helps you find what code takes the longest.  A code profiler lets you quickly look at pieces of code to optimize software performance. cProfile’s profiling interface makes development easier.0.

Python cProfile is a set of numbers that shows how long and often program parts are called and run. You can easily format the report as a pstats module. Coding using cProfile is relatively easy. You just need to import the right function and module to call the run function. 

Check the simple cProfile example right here:

>>> import hashlib

>>> import cProfile

>>> cProfile.run(“hashlib.md5(‘abcdefghijkl’).digest()”)

         4 function calls in 0.000 CPU second

   Ordered by: standard name

   ncalls tottime cumtime percall filename:lineno(function)

        1 0.000 0.000 0.000 0.000 <string>:1(<module>)

        1 0.000 0.000 0.000 0.000 {_hashlib.openssl_md5}

        1 0.000 0.000 0.000 0.000 {method ‘digest’ of ‘_hashlib.HASH’ objects}

        1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}

</module></string>

Code: (Source)

Importing cProfile: Learn the Right Way to Use it!

Users can also use free code profiler tools like Stackify Prefix. Prefix helps speed up coding and handle unexpected issues like hidden exceptions and many more. Prefix puts the power of APM in the hands of developers. By validating the performance of code as it is written, Prefix users push better code to testing, receive fewer support tickets from production, and have happier dev managers. Prefix provides great support for Python, as well as .NET, Java,  PHP, Node JS, and Ruby on Windows and MacOS. Download Prefix for FREE.

With cProfile, developers  can use C extension for long-running programs. C extension is a built-in python module for profiling. It’s a commonly used Python profiler that :

  • Helpss you know the total run time required by the entire code.
  • Identifies the time needed and enables users to find which area needs optimization.
  • Shows what time certain functions are called.
  • Exports  with the help of pstats module.
  • Uses  the snakeviz module to check data.

Code Used for Importing cProfile Package:

# import module

import cProfile

Code: (Source)

Basic Usage of cProfile

Most effective way of profiling with cProfile is with run() function. You can pass a string statement to run(). Check below code to know how you can do so:

>>> x = []>>> type(x)builtins.list

>>> x=[1,2,3,4]

>>> x[1,2,3,4,5]

# 2-dimensional list (list of lists)

>>> x = [[1,2,3,4,5], [5,6,7,8]]

>>> x[[1, 2, 3, 4], [5, 6, 7, 8,9]]

# Jagged list, not rectangular

>>> x = [[1,2,3,4, 5] , [5,6,7]]

>>> x[[1, 2, 3, 4], [5, 6, 7,8]]

# Mixed data types

>>> x = [1,1.0,1+0,’one’,None,True]

>>> x[1, 1.0, (1+0),’one’, None, True]

Code: (Source)

Profiling Function of cProfile that Helps to Call Other Functions:

You can even call other functions using profiling. Pass a main () process to cProfile.run () function as a string. Check the below example to have a better understanding.

from array import *

# Declare an array of 10 floats

num_array = array(‘f’, range(0, 10))

# Printing the array before deletion of elements

print(“num_array before deletion: {}”.format(num_array))

# Delete the first element of array

del num_array[0]

print(“num_array after removing first element: {}”.format(num_array))

# Delete the last element

del num_array[len(num_array)-1]

print(“num_array after removing the last element: {}”.format(num_array))

# Remove the entire array in one go

del num_array

# Printing a deleted array would raise the NameError

print(“num_array after removing first element: {}”.format(num_array))

Code: (Source)

Profile Class of cProfile: How to Use it?

Do you know what you need when you perform the run() method? Even though the most function of cProfile provides you with quick control over some cases and specific techniques that are usually used.