Skip to main content

Command Palette

Search for a command to run...

Why Python Is Slow (and Why That’s Okay)

By : Farah Belhamiti

Updated
2 min read

Python is one of the most used programming languages in the world, yet it is often criticized for its performance. So in this article, we’ll talk about the technical reasons behind its relative slowness compared to other languages.

Interpreted Execution Model

Python is primarily an interpreted language. Unlike compiled languages such as C or C++, which are translated directly into machine code ahead of time, Python code is executed by an interpreter at runtime.

Even though Python source code is first compiled into bytecode, this bytecode is executed instruction-by-instruction by the Python Virtual Machine (PVM). Each operation therefore incurs additional overhead compared to native machine instructions.

Dynamic Typing Overhead

Python is dynamically typed, which means that the type of the variable is decided while the program is running, not before the program runs. So, for example, in Python we can:

X = 5

X = "hello"

This code is valid in Python; unlike other languages like C and C++, code like this will cause a compile-time error.

In contrast, statically typed languages know variable types in advance, allowing compilers to generate highly optimized code.

Object Model and Memory Management

In Python, everything is an object, including integers, floats, and booleans.

This design introduces overhead:

Simple operations involve pointer dereferencing

Objects include reference counters and metadata

Memory allocation is more frequent and less predictable

While this object model improves flexibility and safety, it negatively impacts raw execution speed

Global Interpreter Lock (GIL)

In CPython, the Global Interpreter Lock (GIL) ensures that only one thread executes Python bytecode at a time, which simplifies memory management and prevents race conditions, but it also prevents CPU-bound tasks from running truly in parallel across multiple cores, limiting the performance of multithreaded programs, whereas I/O-bound threads, which spend most of their time waiting on external resources like files, networks, or databases, can run efficiently because the GIL is released during these operations.

Function Call and Abstraction Costs

Python encourages:

- High-level abstractions.
- Frequent function calls.
- Extensive use of libraries.

Each function call involves stack frame creation, argument packing, and dynamic resolution, all of which add overhead compared to inlined or compiled calls in lower-level languages.

Why Python’s Slowness Is Acceptable

Python's perceived slowness is considered acceptable because the language prioritizes human efficiency and developer productivity through its simple syntax. While Python itself may be slower for certain tasks, it can wrap high-performance libraries for heavy computational work, and I/O bottlenecks often make raw execution speed less critical. For tasks requiring optimization, developers can focus on speeding up only the most performance-sensitive sections using tools like Cython. Additional details can be found.