Languages

Python

The default language for data science, machine learning, and backend API development. Its ecosystem covers the full pipeline from data ingestion to model serving.

ANZProspaClearViewIAGEYQantasUnited NationsSwiss Government
The landscape
01

Where data meets application logic

Python is the language we reach for when a system's value sits in its data: ingestion pipelines, analytics platforms, machine learning services, and the APIs that expose them. It is also the first language of the AI ecosystem, so model tooling and reference implementations arrive in Python before they arrive anywhere else.

Modern Python is a production language. Type hints checked with mypy give a codebase a real correctness signal, async support handles high-concurrency workloads, and FastAPI generates documented, validated APIs from the types themselves.

It is the right choice for data pipelines, model serving, internal platforms, and product APIs whose bottleneck is a database or a network call rather than the language runtime. It is the wrong choice where sustained single-threaded throughput is the constraint: pricing engines, real-time bidding, high-frequency processing. Systems like those belong in Go, Java or C++, and the usual pattern keeps Python for everything else while the hot path moves out.

Python was used by 57.9% of respondents to the 2025 Stack Overflow Developer Survey, up roughly seven percentage points on the year before.

CPython has shipped one feature release a year since 2019 under PEP 602, and each release receives security fixes for five years.

Common in Data platforms, ML/AI, API services
Key frameworks FastAPI, Django, Flask, PyTorch
Runtime CPython 3.11+, Uvicorn for async
Typical pattern Data pipelines, ML serving, REST APIs
  • Data Pipelines
  • ML/AI
  • REST APIs
  • Automation
02

Our Python capabilities

FastAPI & async services

We build APIs where the contract, validation and documentation are one artefact: Pydantic models define the types, FastAPI generates the OpenAPI specification from them, and mypy checks the whole path in CI. Async is applied where the workload is I/O-bound, with connection pools sized to the systems behind the service, rather than adopted as a default that complicates debugging.

  • FastAPI
  • Pydantic
  • Uvicorn

Data pipelines & orchestration

Production pipelines are orchestrated with Airflow or Prefect, transformed with dbt, and processed with pandas or Polars depending on scale. The hard part of pipeline work is rarely the transformation logic: it is idempotency, backfill, and knowing a run failed before the business does. We build those in from the first DAG, with retries that alert, data-quality checks as tasks, and backfills that re-run safely.

  • Apache Airflow
  • dbt
  • Polars

ML model serving & inference

Models move from notebook to production behind BentoML or Ray Serve, with MLflow recording what was trained on what. For LLM applications the same discipline applies to prompts and retrieval pipelines: versioned, evaluated against recorded cases, and instrumented so a quality regression shows up in metrics rather than in user complaints.

  • BentoML
  • Ray Serve
  • MLflow
03

Why Adaca for Python?

04

How We Staff It

A Python team usually takes one of two shapes. Product and API work takes backend engineers with FastAPI or Django depth, often paired with a React or TypeScript front end. Data and ML work takes data engineers who are also sound software engineers, because pipeline code outlives the analysis it was written for.

Python sits near the centre of our engineering pool across web, data and AI work. Engineers are staffed from that pool to your stack and your conventions, and they work to your working day.

05

Common Questions

Should we build this in Django or FastAPI?

Django suits a product with accounts, permissions, an admin surface and a relational schema: most of that arrives built and reviewed rather than written from scratch. FastAPI suits services whose job is an API: it is lighter, async-first, and generates its documentation from the code.

The two coexist well. A common shape is a Django core with FastAPI services beside it for high-concurrency or model-serving endpoints, split along that line rather than forcing either framework to do the other's job.

Is Python fast enough for a production API?

For most APIs, yes. The bottleneck in a typical service is the database or a downstream call, and an async Python service spends its time waiting on those whatever the language. On Uvicorn, an I/O-bound FastAPI service holds thousands of requests a second.

Where Python is not fast enough is sustained CPU-bound work. If an endpoint computes rather than coordinates, we profile first, then move that path to Go, Java or C++ while Python keeps the rest of the service.

Can we run Claude and OpenAI models behind the same application?

Yes. Both providers ship first-class Python SDKs, and the usual pattern is a thin seam over the calls your application makes, so models can be swapped or mixed per task. Prompts and evaluations are versioned per model, because a prompt tuned for one does not transfer unchanged to another.

Is Python well suited to AI-accelerated development?

Yes, with one caveat. Python has the densest public code corpus of any language, so coding agents produce idiomatic Python with fewer corrections than almost any other stack. The caveat is the correctness signal: dynamic typing gives an agent less to check its work against than a compiled, typed language does.

The remedy is the discipline we apply anyway: strict mypy, a fast test suite, and Ruff in CI. With those in place an agent gets a quick, checkable feedback loop. The measured results of our AI-augmented delivery flow are on the Technology page.

Does AI-assisted delivery work on a legacy Python codebase?

It depends what the codebase gives the tooling to check against. A legacy system with tests and type hints is a strong candidate: an agent can read it, change it, and verify the change. A large untyped codebase without tests gives an agent nothing to verify against, so the first step is adding characterisation tests and types to the paths being changed.

That first step is ordinary engineering work, and it pays back for the human engineers as much as for the tooling.

How quickly can you staff a Python role?

Python is one of the deepest areas of our pool, across API, data and ML work, so a shortlist usually reaches you within 48 hours of a brief. It draws on people we already employ or already know, and dedicated recruitment covers specialised gaps such as ML infrastructure.

You interview and decide. Engagement terms are three, six, nine or twelve months, chosen up front.