Chapter 1. Benchmarking and Profiling
Recognizing the slow parts of your program is the single most important task when it comes to speeding up your code. Luckily, in most cases, the code that causes the application to slow down is a very small fraction of the program. By locating those critical sections, you can focus on the parts that need improvement without wasting time in micro-optimization.
Profiling is the technique that allows us to pinpoint the most resource-intensive spots in an application. A profiler is a program that runs an application and monitors how long each function takes to execute, thus detecting the functions in which your application spends most of its time.
Python provides several tools to help us find these bottlenecks and measure important performance metrics. In this chapter, we will learn how to use the standard cProfile
module and the line_profiler
third-party package. We will also learn how to profile an application's memory consumption through the memory_profiler
tool. Another useful tool that we will cover is KCachegrind, which can be used to graphically display the data produced by various profilers.
Benchmarks are small scripts used to assess the total execution time of your application. We will learn how to write benchmarks and how to accurately time your programs.
The list of topics we will cover in this chapter is as follows:
- General principles of high performance programming
- Writing tests and benchmarks
- The Unix
time
command - The Python
timeit
module - Testing and benchmarking with
pytest
- Profiling your application
- The
cProfile
standard tool - Interpreting profiling results with KCachegrind
line_profiler
andmemory_profiler
tools- Disassembling Python code through the
dis
module