Home Expressions
Docs
Drivers Gateway SDKs Benchmarks
Changelog
GitHub
Blog Status Roadmap
← Back to benchmark index
Transport report December 27, 2025

Python IPC Transport Report

December 27, 2025 socket transport and PyO3 extension snapshot.

2.0x

socket-path throughput relative to the PyO3 path in this run

248,524
Python IPC q/s
socket plus JSON path
122,000
PyO3 q/s
extension path
16,000
asyncpg q/s
sequential baseline

10 Million Query Results

DriverQueries/sRelative to PyO3Notes
Python IPC248,5242.0xPure Python, socket plus JSON
PyO3 (current qail-py)122,000baselineRust FFI with GIL handoff
asyncpg16,0000.13xSequential queries

Interpretation

In this workload, the Python socket client to qail-daemon reached 248,524 q/s while the PyO3 path reached 122,000 q/s. Treat the number as a transport-boundary measurement tied to this prepared-statement pattern rather than a language-wide claim.

Reference Client Shape

from qail_ipc import connect

client = connect()
client.connect_pg("localhost", 5432, "user", "db", "")
handle = client.prepare("SELECT id, name FROM users LIMIT $1")
params = [["10"], ["5"], ["1"]] * 3333
count = client.prepared_pipeline(handle, params)

Transport Notes

AspectPyO3 (FFI)IPC (socket)
GIL handlingExplicit thread handoffAutomatic under socket I/O
Build couplingRequires maturin plus RustPure Python client package
Memory boundaryShared Python/Rust heapProcess boundary
Prepared statementsLimited cache scopeDaemon-wide cache

Transport Snapshot Across Languages

RuntimeIPC queries/sRelative note
Python IPC248,5242.0x vs PyO3
Go IPC237,5610.99x vs pgx
Rust baseline355,000workspace baseline

Variance note

The Python and Go IPC numbers were within roughly 5% in separate harnesses. Treat that as directional only because client runtime behavior and measurement variance differ between the two runs.

Interpretation summary

  • The report compares two Python transport boundaries under the same prepared workload shape.
  • The daemon cache kept the socket path materially above the sequential asyncpg baseline shown here.
  • The socket boundary separates the Python process from the Rust executor.
  • Rerun on your own workload before using the ratio in production planning.