Profile a Python script
This task describes how to profile a Python script. This feature is useful when profiling a mixed C, C++, Fortran, and Python program.
About this task
Python profiling replaces main thread stack frames originating from the
Python interpreter with Python stack frames of the profiled Python
script. To disable this feature, set FORGE_SAMPLER_DISABLE_PYTHON_PROFILING=1
.
Linaro MAP supports Python profiling with the following features:
Profiles Python scripts running under the CPython interpreter.
Profiles Python scripts running under virtual environments.
Profiles Python scripts that import modules which perform MPI on the main thread, such as mpi4py.
Profiles Python scripts that import modules which use OpenMP.
Profiles Python scripts that use the
threading
module.
Note
Linaro MAP will output warnings if the threading model of the MPI module is
MPI_THREAD_MULTIPLE
, such as in mpi4py. To prevent these warnings,
change the default settings in mpi4py with the following:
mpi4py.rc.threaded = False
or mpi4py.rc.thread_level = "funneled"
.
Note
If you are profiling on a system using ALPS or SLURM and the Python script does not use MPI, you can set environment variables (Starting a program) or you can import the mpi4py module.
Procedure
Results
When Linaro MAP finishes profiling the Python script, it saves a .map
file in
the current working directory and opens it for viewing in the user interface
(unless you are using the offline feature).
Example: Profiling a simple Python script
This section demonstrates how to profile the Python example script
python-profiling.py
located in the examples
directory.
Change into the
examples
directory and run the makefile to compile the example.$ make -f python-profiling.makefile
Start Linaro MAP.
$ ../bin/map python ./python-profiling.py --seconds 15
Click Run.
Wait for Linaro MAP to finish analyzing samples after the Python script has completed.
Note
The Linaro MAP user interface launches showing the Python script and the line in the script where the most time was spent is selected.
Locate the first
logistic_map_c
stack frame in the Main Thread Stacks view. The callout to the C function is appended undermain
Python stack frame.
Next steps
Examine the Main Thread Activity graph (Metrics view) for an overview of time spent in Python code compared with non-Python code.
View source code lines (Source code (MAP)) on which time was spent executing Python code and non-Python code.
Compare time spent on the selected line executing Python code with non-Python code in the Selected lines view (Selected lines view).
View a breakdown of time spent in different code paths in the Main Thread Stacks view (Stacks view).