Short answer: Python is the language of artificial intelligence because its ecosystem covers the entire lifecycle — data preparation, model training, language-model integration, and deployment — without ever handing off to another primary language. Nothing else comes close, and the gap is widening rather than closing.
Now the part the tutorials leave out. A while ago I spent several weeks building a machine-learning pipeline over twenty years of gold price data. Forty-three engineered features. Clean train, validation and test splits, no leakage, careful about the time ordering. The model came back with an AUC of about 0.50 — which, if you have not met that number before, means it had learned exactly nothing. A coin flip with more electricity.
That project taught me more about Python in AI than any successful one, for a simple reason: getting to a trustworthy "no" took four Python libraries and about two hundred lines. In any other language it would have taken a month and I would probably have stopped before finding out. Python's real value is not that it makes models good. It is that it makes the truth cheap to reach.
Why Python won
Python did not win because it is the best-designed language for numerical computing. It won because of thirty years of compounding, and the story is worth knowing because it tells you how durable the position is.
The turning point was numerical arrays. Python on its own is a poor fit for maths on large datasets, but NumPy gave it a fast, compiled array type with a comfortable interface — the foundation that the 2020 Nature paper on array programming credits with making Python viable for scientific work at all. Once the arrays were fast, researchers had a language that was pleasant to think in and fast enough to compute in.
From there it was network effects. Researchers wrote experiments in Python, so published implementations were in Python. Those implementations needed libraries, which were written in Python. Scikit-learn standardised classical machine learning around one API. When deep learning took off, the frameworks were Python-first. By the time large language models arrived, nobody even considered shipping an SDK in anything else first.
What that means in 2026, practically: a new model gets a Python client on day one and possibly a JavaScript one by the end of the month. A new technique appears as a Python repository. A new vector database ships Python bindings before a REST guide. Being in the Python ecosystem is not a preference, it is access.
"But Python is slow"
This is the most common objection and the most misunderstood, so it is worth two minutes.
Yes, the Python interpreter is slow compared to C. No, that is usually not what your AI code is waiting on. When you call a NumPy operation, a scikit-learn fit or a PyTorch forward pass, Python hands the work to compiled C, C++, Fortran or CUDA and waits for the result. Python is the conductor, not the orchestra. A matrix multiplication on a GPU does not care what language asked for it.
Python speed becomes a genuine problem in exactly three situations:
- You wrote a loop where an array operation belonged. Iterating row by row over a large dataframe instead of vectorising is the classic. The fix is almost always rewriting three lines, not changing language.
- Your workload is many tiny operations rather than a few big ones. Per-call interpreter overhead dominates when each call does very little.
- You are serving at very high throughput with tight latency budgets. Real, and the usual answer is to export the trained model and serve it elsewhere — see when not to use Python below.
For everything else — which is most work, most of the time — the bottleneck is disk, network, GPU or your own thinking. I have never once had a project where Python's interpreter speed was the reason something did not ship.
The real project lifecycle
Python's distinctive advantage is that it is the only language covering every stage without a handoff. The same person, in the same environment, can go from a raw CSV to a running API. That continuity is worth more than any individual library.
| Stage | Typical share of effort | What Python does here |
|---|---|---|
| Framing the problem | Small, decisive | Nothing. This part is thinking, and skipping it is why most projects fail. |
| Data collection | Large | requests, SQLAlchemy, scrapers, API clients, scheduled jobs |
| Cleaning and feature work | The majority | pandas, NumPy, validation, joins, leakage checks |
| Training | Surprisingly small | scikit-learn, XGBoost, PyTorch |
| Evaluation | Small, decisive | metrics, cross-validation, walk-forward splits, SHAP |
| Deployment | Moderate | FastAPI, Docker, background workers |
| Monitoring and retraining | Forever | logging, drift checks, scheduled pipelines |
The ratio people find hardest to accept is that training is the short part. In my own projects the split has been something like a few weeks of data work, an afternoon of training and a day of evaluation — and then back to the data, because the evaluation said something honest. If a course promises you will be "training models" on day one, it is teaching you the smallest slice of the job.
Data collection and preparation
This is where Python earns its reputation, and where most of the hours go.
For collection: requests and httpx for APIs, BeautifulSoup for HTML, SQLAlchemy for databases, and a scheduler such as Airflow or Prefect once the job needs to run on its own. For preparation, pandas does the overwhelming majority of the work: loading, joining, reshaping, grouping, filling gaps, encoding categories, deduplicating, and splitting into train, validation and test sets.
Three habits that have saved me the most pain:
- Validate on load, not on failure. Check the row count, the date range, the null rates and the types the moment the data comes in. A pipeline that silently ingests a half-empty file is worse than one that crashes.
- Split on time for anything time-dependent. A random split on time-series data leaks the future into training and produces a model that looks brilliant and is worthless. For the price work I mentioned, walk-forward validation was the only split that told the truth.
- Write the cleaning as a script, never as notebook cells you ran in some order. If you cannot reproduce the dataset from raw with one command, you do not have a dataset, you have a memory.
Classical machine learning
Scikit-learn remains the standard and remains underrated. For tabular data — classification, regression, anomaly detection, clustering — it, plus gradient boosting through XGBoost or LightGBM, still beats deep learning on most business problems while being far easier to explain to the person paying for it.
The Python patterns worth learning properly:
- Pipeline objects so preprocessing and modelling travel together and the same transformations apply at inference. This single habit prevents a whole class of production bugs.
- Cross-validation done appropriately for your data — stratified for imbalanced classes, grouped when rows share an entity, time-series splits when order matters.
- Hyperparameter search with
GridSearchCVfor small spaces or Optuna for large ones. On one strategy-optimisation project I ran a grid of 1,536 parameter combinations with walk-forward validation on every one; that is an overnight job in Python and it would be a week's work to build anywhere else. - SHAP for explaining what the model is actually using. Often the most valuable output of a modelling project is the discovery that one feature is doing all the work and it should have been a rule.
And learn to read metrics before you learn more algorithms. Coming back to that gold dataset: forty-three features, careful engineering, and an AUC hovering around 0.50. The useful skill was not building a better model, it was recognising quickly that the signal was not there at that granularity — and moving the question to a level where it was. A model that cannot beat a coin flip is information, not failure, as long as you find out in week three rather than after launch.
Deep learning
PyTorch is what to learn. It dominates research to a degree that is hard to overstate: JetBrains reported in 2026 that it powers around 85 percent of deep learning papers at top conferences. Since research is where new techniques appear first, learning PyTorch means new ideas arrive in a syntax you already read.
The nuance the internet usually skips: TensorFlow is not dead in production. The same JetBrains analysis puts TensorFlow ahead of PyTorch in enterprise market share, with more companies using it. Research and production have genuinely different centres of gravity. So learn PyTorch, but do not be surprised to inherit TensorFlow at an established company, and do not treat it as a mistake someone made.
A typical PyTorch workflow is refreshingly ordinary Python: define the model as a class, write an explicit training loop, log metrics to MLflow or Weights & Biases, checkpoint, evaluate, export. Nothing is hidden, which is exactly why researchers like it and why it is a good thing to learn on.
LLMs and AI agents
This is the fastest-moving area and the one with the shortest path from nothing to something useful.
The base pattern is small: call a model with the openai or anthropic SDK, or a local model through Ollama; send a structured prompt; parse the response; use it. Around that base, four things are worth learning properly:
Define the shape you want as a model class and validate what comes back. Parsing free text with regular expressions is a phase everyone goes through once.
Let the model invoke your Python functions. This is the capability that turns a chatbot into something that can actually do work.
Tokens as they arrive, so an interface feels responsive. Easy to add early, annoying to retrofit later.
Rate limits and timeouts are normal operating conditions, not exceptions. Code accordingly from the start.
Above that sit the frameworks. LangChain for composing chains and tools, LangGraph for stateful workflows with branching, Hugging Face Transformers for running and fine-tuning open models. My honest advice is to write the raw API calls yourself first. Frameworks hide the loop, and if you do not understand the loop you cannot debug it.
Which is the bridge to two related skills: the quality of what comes out depends on how you specify the request, covered in the prompt engineering guide, and once one call becomes a repeatable cycle with verification and a stopping rule, you have moved into loop engineering. Python is the substrate for both.
RAG systems
Retrieval-augmented generation — putting relevant pieces of your own documents into the model's prompt so the answer is grounded in your data — is the most requested AI feature in ordinary businesses, and Python is where it gets built.
The pipeline is short enough to hold in your head:
import chromadb
from openai import OpenAI
client = OpenAI()
db = chromadb.PersistentClient(path="./store").get_or_create_collection("docs")
def embed(texts):
resp = client.embeddings.create(model="text-embedding-3-small", input=texts)
return [d.embedding for d in resp.data]
def index(chunks):
"""chunks: list of (id, text). Split on headings, not every 500 characters."""
ids = [c[0] for c in chunks]
texts = [c[1] for c in chunks]
db.add(ids=ids, documents=texts, embeddings=embed(texts))
def answer(question, k=4):
hits = db.query(query_embeddings=embed([question]), n_results=k)
context = "\n\n---\n\n".join(hits["documents"][0])
prompt = (
"Answer using ONLY the context below. "
"If the context does not contain the answer, say you do not know.\n\n"
f"Context:\n{context}\n\nQuestion: {question}"
)
reply = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return reply.choices[0].message.content
That is the entire concept. What separates a demo from something people trust is everything around it: how you split the documents (on semantic boundaries, not fixed character counts), whether you keep the source reference so answers can cite it, whether you re-rank the retrieved passages, and what the system does when retrieval finds nothing relevant. The instruction to say "I do not know" in that prompt is doing more work than the vector database.
Deployment and MLOps
A model that only runs in your notebook is a hobby project. Python covers this stage too, and the stack is stable enough now to be boring, which is a compliment.
FastAPI is the default for serving: async, fast, with automatic OpenAPI docs and pydantic validation built in. Docker packages it so it runs the same on your machine and the server. MLflow tracks experiments and model versions. Ordinary logging and metrics do the rest.
A pattern I use and recommend: put a thin Python service in front of your model rather than calling it directly from your application. I run a small FastAPI proxy in front of a local Ollama instance that logs every request and response to PostgreSQL, handles streaming, and can route different request types to different models. It took an afternoon and it has paid for itself many times over — because when something behaves strangely, the answer is a SQL query away instead of a guess.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
import joblib
import logging
app = FastAPI(title="Scoring API")
model = joblib.load("model.joblib")
log = logging.getLogger("scoring")
class Request(BaseModel):
features: list[float] = Field(..., min_length=43, max_length=43)
@app.post("/score")
def score(req: Request):
try:
value = float(model.predict_proba([req.features])[0][1])
except Exception as exc:
log.exception("scoring failed")
raise HTTPException(status_code=500, detail="scoring failed") from exc
log.info("scored request", extra={"probability": value})
return {"probability": round(value, 4)}
@app.get("/health")
def health():
return {"status": "ok"}
Three things in there matter more than the model: the input is validated before it reaches it, failures are logged with a stack trace and returned as a clean error, and there is a health endpoint so whatever supervises the process knows whether it is alive. That is the difference between a script and a service.
Environments: the part tutorials skip
Nobody writes articles about this and it is where beginners lose the most days, so here it is.
Python's dependency management is its weakest point, and the AI stack is the worst case: large packages, CUDA versions tied to driver versions, and libraries that change their API between minor releases. The rules that keep me out of trouble:
- One environment per project, always.
venv,uvor conda — pick one and be consistent. Installing AI packages into your system Python will eventually break something you did not know depended on it. - Pin your versions. Not
torch, buttorch==2.4.1. "It worked last month" is not a reproducible build. - Install PyTorch from its own instructions, matching your CUDA version. A plain
pip install torchon a GPU machine is how you end up with a CPU-only build and a confusing afternoon. - Use Docker as soon as anything needs to run somewhere else. It converts "works on my machine" from a joke into a guarantee.
- Keep a written record of how the environment was built. A requirements file, a lock file, a Dockerfile — something a future person, probably you, can rebuild from.
None of this is intellectually interesting. All of it is the difference between a project you can return to in six months and one you have to rebuild.
The libraries that matter in 2026
| Stage | Libraries | What you use it for |
|---|---|---|
| Data | pandas, NumPy, Polars | Loading, cleaning, reshaping, numerical work |
| Visualisation | Matplotlib, Plotly | Looking at the data before modelling it |
| Classical ML | scikit-learn, XGBoost, LightGBM | Tabular classification and regression |
| Explainability | SHAP | Finding out what the model actually uses |
| Deep learning | PyTorch, Keras | Neural networks, vision, custom architectures |
| Language models | openai, anthropic, transformers, ollama | Hosted APIs, open models, local inference |
| Agents and RAG | LangGraph, LangChain, ChromaDB, sentence-transformers | Multi-step workflows and retrieval |
| Validation | pydantic | Structured inputs and structured model output |
| Serving | FastAPI, Uvicorn, Docker | Turning a model into a service |
| Tracking | MLflow, Weights & Biases | Experiments, metrics, model versions |
You do not need all of these. A working AI engineer can go a long way on pandas, scikit-learn, one model SDK, pydantic and FastAPI.
When not to use Python
Being honest about this makes the rest of the advice more trustworthy.
- Low-latency, high-throughput inference. When you are serving many requests with a tight latency budget, the usual pattern is to train in Python and export to ONNX, or reimplement serving in C++, Go or Rust.
- Mobile and embedded. On-device inference goes through Core ML, TensorFlow Lite or ONNX Runtime, not a Python interpreter.
- Inside an existing system in another language. If the application is a Java monolith — and I have spent years in those — the sensible integration is often an API boundary, not a Python rewrite.
- Heavy real-time stream processing. The JVM ecosystem is still stronger here.
Notice the pattern: the exceptions are all about serving, never about building. Almost everyone still develops and trains in Python and then decides how to deploy.
How to start, in the order that works
Functions, lists and dicts, comprehensions, files, virtual environments, and how to read a traceback. Metaclasses and descriptors can wait indefinitely.
Pick a messy CSV from your own work. Clean it, group it, join it, chart it. This skill underlies every stage that follows.
A script that calls a model, validates the output with pydantic and does something useful. Fastest feedback loop available in AI right now, and it keeps motivation alive.
Split honestly, fit a baseline, measure it. Learning what an unimpressive result looks like is more valuable than learning another algorithm.
Wrap it in an API, containerise it, add logging, run it somewhere that is not your laptop. This is the step that turns learning into a portfolio.
Notice what is not on the list: a deep learning course before you have cleaned a dataset, or a maths refresher before you have run anything. Both have their place, later. Nothing keeps people learning like something that works.
Need Python and AI built into your business, not just explained?
Filtori builds Bale and Telegram bots, websites and AI automation in Python — from data pipelines and RAG over your own documents to model APIs, local LLM infrastructure and the monitoring that keeps it all honest.
Glossary
- Glue language
- A language used to orchestrate components written in faster languages. Python's numerical stack is C, C++, Fortran and CUDA underneath; Python decides what runs and in what order.
- Vectorisation
- Replacing an element-by-element Python loop with a single array operation that runs in compiled code. It is the difference between minutes and milliseconds on the same data.
- RAG (retrieval-augmented generation)
- Retrieving relevant passages from your own documents and putting them in the model's prompt, so the answer is grounded in your data instead of the model's memory.
- Embedding
- A list of numbers representing a piece of text, such that texts with similar meaning have nearby vectors. It is what makes semantic search possible.
- AUC
- A score between 0 and 1 for how well a classifier separates two classes. 1.0 is perfect and 0.5 is a coin flip, which makes it the fastest way to find out that a model has learned nothing.
- Data leakage
- When information that would not exist at prediction time slips into training. It produces excellent test scores and a model that fails the moment it meets reality.
- MLOps
- The operational side of machine learning: packaging models, serving them, versioning experiments, monitoring drift and retraining on a schedule rather than on a hunch.
- Virtual environment
- An isolated set of Python packages for one project. Skipping it is the most common reason a project that worked last month no longer runs.
Frequently asked questions
Why is Python the dominant language for artificial intelligence?
Is Python too slow for AI?
How much Python do I need before starting with AI?
Which Python libraries matter most for AI in 2026?
Should I learn PyTorch or TensorFlow?
Can Python cover an entire AI project end to end?
When should I not use Python?
Do I need a GPU to learn Python for AI?
Sources
- Harris, C. R. et al. — Array programming with NumPy, Nature 585. September 2020
- Pedregosa, F. et al. — Scikit-learn: Machine Learning in Python, JMLR 12. 2011
- Paszke, A. et al. — PyTorch: An Imperative Style, High-Performance Deep Learning Library. December 2019
- JetBrains — PyTorch vs. TensorFlow: Choosing the Right Framework in 2026 (research share and enterprise adoption figures). May 2026
- Python Software Foundation and JetBrains — Python Developers Survey.
- PyTorch — Install instructions by CUDA version.
- Project examples, backtest results and failure modes: the author's own machine-learning and LLM systems at Filtori, 2024–2026.
