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 and memory_profiler tools
- Disassembling Python code through the dis module