DEV Community

Cover image for From Code to Output: What Really Happens When You Run Python?
Kshitij Patil
Kshitij Patil

Posted on

From Code to Output: What Really Happens When You Run Python?

"Python is an interpreted language."

You've probably heard this phrase countless times while learning Python.

But let’s pause for a second…

What actually happens after you hit Run?

When you execute something as simple as:

print("Hello, World!")
Enter fullscreen mode Exit fullscreen mode

How does your computer, built to understand only binary (0s and 1s), figure out what print() means?

The truth is, there’s a lot happening behind the scenes.

Let’s break it down in a simple and intuitive way.


The Hidden Workflow of Python

Here’s a simplified overview of what happens:

Python Source Code (.py)
          │
          ▼
Compilation Step
          │
          ▼
Bytecode (.pyc)
          │
          ▼
Python Virtual Machine (PVM)
          │
          ▼
Machine Instructions
          │
          ▼
CPU Execution
          │
          ▼
Program Output
Enter fullscreen mode Exit fullscreen mode

Many beginners assume Python directly runs their code.

But in reality, Python follows a two-step process before execution.


Step 1, Writing Python Code

Let’s begin with a basic script:

# hello.py

print("Hello, World!")
Enter fullscreen mode Exit fullscreen mode

At this stage, your file is just plain text.

Your computer doesn’t understand:

  • Functions like print()
  • Control structures like if, for, while
  • Variables or expressions

It only understands low-level machine instructions.

So Python needs to translate your code first.


Step 2, The Python Interpreter Steps In

When you run:

python hello.py
Enter fullscreen mode Exit fullscreen mode

you’re invoking the Python Interpreter.

The most widely used implementation is CPython, written in C.

Its responsibilities include:

  • Reading your code
  • Checking for syntax errors
  • Converting it into bytecode
  • Executing that bytecode

So Python doesn’t directly interpret your source code, it first compiles it into an intermediate form.


Step 3, Bytecode: Python’s Internal Language

Instead of converting your code straight into machine instructions, Python transforms it into bytecode.

Think of bytecode as a simplified, platform-independent instruction set.

For example:

x = 5
y = 10

print(x + y)
Enter fullscreen mode Exit fullscreen mode

might internally look like:

LOAD_CONST 5
STORE_NAME x

LOAD_CONST 10
STORE_NAME y

LOAD_NAME x
LOAD_NAME y

BINARY_ADD

PRINT
Enter fullscreen mode Exit fullscreen mode

You don’t need to memorize this, it just shows how Python simplifies your code before execution.


What Are .pyc Files?

You might have seen a folder like this:

__pycache__
Enter fullscreen mode Exit fullscreen mode

Inside it, files like:

hello.cpython-313.pyc
Enter fullscreen mode Exit fullscreen mode

These .pyc files store compiled bytecode.

Python uses them to avoid recompiling unchanged files, making your programs start faster.


Curious? Inspect Bytecode Yourself

Python provides a module called dis to view bytecode.

Try this:

import dis

def add(a, b):
    return a + b

dis.dis(add)
Enter fullscreen mode Exit fullscreen mode

Example output:

LOAD_FAST 0 (a)
LOAD_FAST 1 (b)
BINARY_ADD
RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

This is exactly what Python executes internally.


Step 4, The Python Virtual Machine (PVM)

Now comes execution.

The Python Virtual Machine (PVM) is the engine that runs bytecode.

It’s not hardware, it’s part of the interpreter.

It works in a loop:

Fetch → Decode → Execute
Enter fullscreen mode Exit fullscreen mode
  • Fetch the next instruction
  • Decode what it means
  • Execute it

This cycle continues until your program finishes.


Walking Through Execution

Let’s revisit:

print("Hello, World!")
Enter fullscreen mode Exit fullscreen mode

Here’s what happens step by step:

1. You run the script

python hello.py
Enter fullscreen mode Exit fullscreen mode

2. Python reads your code

3. It compiles it into bytecode

4. The PVM executes instructions like:

LOAD_CONST "Hello, World!"
CALL_FUNCTION print
RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

5. Output appears

Hello, World!
Enter fullscreen mode Exit fullscreen mode

Done!


Why Isn’t Python as Fast as C?

Let’s compare:

C Execution

C Code → Compiler → Machine Code → CPU
Enter fullscreen mode Exit fullscreen mode

Python Execution

Python Code → Bytecode → PVM → CPU
Enter fullscreen mode Exit fullscreen mode

Python adds an extra layer (the PVM), which introduces overhead.

That’s why Python is generally slower for heavy computations.

But this design also makes Python:

  • Portable
  • Easy to use
  • Flexible

Memory Management in Python

Python handles memory automatically.

It stores objects in a region called the heap.

When objects are no longer needed, Python cleans them up using:

  • Reference counting
  • Garbage collection

This means you don’t have to manually manage memory like in C or C++.


A Simple Way to Think About It

Imagine you're speaking to someone who doesn’t understand your language.

You use a translator:

You → Translator → Listener
Enter fullscreen mode Exit fullscreen mode

In Python terms:

  • You → Programmer
  • Python Code → Your language
  • PVM → Translator
  • CPU → Listener

The CPU never understands Python directly, the PVM bridges that gap.


Final Thoughts

Once you understand what happens behind the scenes, Python feels less like magic and more like a well-designed system.

So next time someone says:

"Python is an interpreted language."

You’ll know the full story.

Python first compiles your code into bytecode, then executes it using the Python Virtual Machine.

And that journey, from a simple .py file to actual output, is what makes Python both powerful and accessible.


Thanks for reading!

I’m sharing my learning journey in Python, backend development, and software engineering. If you found this helpful, feel free to follow along for more simple explanations of complex topics.

Top comments (0)