Three realistic Python serverless workloads measured live from your
browser against two deployed workers — pymode (this domain) and
Cloudflare’s Pyodide-based Python Workers (a separate *.workers.dev
deployment with the same handler source).
Cold start (CF-reported at deploy time)
Cloudflare prints "Worker Startup Time" after every wrangler deploy, measured before any traffic hits the worker. These are the only honest cold-start numbers — a live page-load benchmark always finds the isolate already warmed up by someone else.
| Runtime | Worker Startup Time |
| pymode | 52 ms |
| Cloudflare Python Workers (Pyodide) | 1134 ms |
Warm latency (live, from your browser)
CSV → JSON aggregate
POST /api/csv
POST a CSV chunk, parse with stdlib csv.DictReader, return aggregated JSON (row count + numeric column means). Real S3 / Kinesis ETL ingest pattern. Both runtimes use stdlib.
| p50 | p99 | OK |
| pymode | — | — | — |
| Cloudflare Python Workers (Pyodide) | — | — | — |
Regex log extract
POST /api/logs
POST nginx-style access logs, regex-extract IPs and HTTP status codes, return per-status counts and unique-IP count. Real CloudWatch / log scrubbing pattern. Stdlib re.
| p50 | p99 | OK |
| pymode | — | — | — |
| Cloudflare Python Workers (Pyodide) | — | — | — |
HTML link extract
POST /api/scrape
POST HTML, parse with stdlib html.parser, return list of <a href> targets. Real RSS / sitemap scraping pattern. Stdlib only.
| p50 | p99 | OK |
| pymode | — | — | — |
| Cloudflare Python Workers (Pyodide) | — | — | — |
Image thumbnail (Pillow)
POST /api/image
POST a JPEG, resize with Pillow. Real S3-image-upload trigger pattern. Requires Pillow — neither runtime has it deployed yet (pymode needs the variant wired into AOT; CF Pyodide can't load it). Both cells will be HTTP 501.
| p50 | p99 | OK |
| pymode | — | — | — |
| Cloudflare Python Workers (Pyodide) | — | — | — |