Skip to main content

Detect Python performance regressions and compare execution traces with lightweight call graph visualization

Project description

OracleTrace — Detect Python Performance Regressions with Execution Diff

Detect performance regressions between runs of your Python script in seconds.

OracleTrace Logo

Fail your CI when performance regresses.

OracleTrace is a git diff for performance.

Run your script twice and instantly see what got slower — with function-level precision.

PyPI PyPI Downloads GitHub Stars GitHub Forks CI Tests

Documentation: https://kaykcaputo.github.io/oracletrace/

Featured in: PyCoder's Weekly #729La Experimental #30Python技术周刊 #15,#16 and #17 Woudar's Blog #214awesome-debuggerawesome-profiling


Installation

pip install oracletrace

Quick Start

1. See where your program spends time instantly:

oracletrace app.py

2. Compare runs and detect regressions:

oracletrace app.py --json baseline.json
oracletrace app.py --json new.json --compare baseline.json

Examples

Try these ready-to-run scripts to explore OracleTrace features:

# CPU hotspot — highlights the heaviest function
oracletrace examples/cpu_hotspot.py

# Nested call graph — see the tree visualization
oracletrace examples/nested_calls.py

# Regression demo — baseline vs slower path
oracletrace examples/regression_demo.py --json baseline.json
SLOW=1 oracletrace examples/regression_demo.py --json current.json --compare baseline.json

All examples are deterministic, finish in under a second, and live in examples/. They can also be reused in test suites as smoke tests.


See it in action

See exactly which functions got slower between runs:

OracleTrace CLI demo


Example Output

Starting application...

Iteration 1:
  > Processing data...
    > Calculating results...

Iteration 2:
  > Processing data...
    > Calculating results...

Application finished.

Summary:
                         Top functions by Total Time
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
┃ Function                     ┃ Total Time (s) ┃ Calls ┃ Avg. Time/Call (ms) ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
│ my_app.py:main               │         0.6025 │     1 │             602.510 │
│ my_app.py:process_data       │         0.6021 │     2 │             301.050 │
│ my_app.py:calculate_results  │         0.4015 │     2 │             200.750 │
└──────────────────────────────┴────────────────┴───────┴─────────────────────┘

Logic Flow:
<module>
└── my_app.py:main (1x, 0.6025s)
    └── my_app.py:process_data (2x, 0.6021s)
        └── my_app.py:calculate_results (2x, 0.4015s)

Why OracleTrace?

Problem

Performance regressions are hard to detect early.

Solution

OracleTrace compares execution traces and highlights what got slower.

How it works

  1. Run your script
  2. Generate a trace
  3. Compare results
  4. Identify slowdowns

CI Integration

Fail your pipeline when performance degrades:

oracletrace run \
  --repeat 5 \
  --json current.json \
  --compare baseline.json \
  --fail-on-regression \
  --threshold 10 \
  -- pytest tests/

Add it to your CI to automatically fail on performance regressions.


Key Features

  • Detect slower and faster functions
  • Identify new or removed functions
  • Execution time and call count analysis
  • Call graph visualization
  • JSON and CSV export
  • Regex-based filtering (--ignore)
  • Top-N function focus (--top)
  • CI regression gates

CLI Reference

Flag Description
--json Export trace to JSON
--csv Export trace to CSV
--html Export trace to html
--compare Compare with another trace
--fail-on-regression Exit with error if regression detected
--threshold Regression percentage threshold
--ignore Ignore functions/files via regex
--top Show top N functions
--repeat Repeat the tracing N times

Use Cases

Primary

  • Detect performance regressions between runs

Secondary

  • CI performance validation
  • Execution trace inspection
  • Call graph visualization

How It Works

OracleTrace uses Python’s sys.setprofile() to intercept function calls and returns.

It measures execution time per function and records caller–callee relationships.

Filtering removes external/internal calls to focus on application code.


Requirements

  • Python >= 3.11
  • rich

Contributing

Contributions are welcome.

Please read the Contributing Guide for details on how to get started, coding standards, and the contribution process.


Contributors


⭐ Support the Project

If OracleTrace is useful, consider giving it a star:

GitHub Repository


Maintainers

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oracletrace-3.0.1.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oracletrace-3.0.1-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file oracletrace-3.0.1.tar.gz.

File metadata

  • Download URL: oracletrace-3.0.1.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for oracletrace-3.0.1.tar.gz
Algorithm Hash digest
SHA256 772f1fa9cfafeace3496b6d90fd2411daa01915a3dad17fa19a50af2fdb46783
MD5 9971ee9dc5c4d6e41de93a9581c503ae
BLAKE2b-256 191f20d9de7ea1517b87a76f474e9247d1a9bbef30507cc216c743b418138fe5

See more details on using hashes here.

File details

Details for the file oracletrace-3.0.1-py3-none-any.whl.

File metadata

  • Download URL: oracletrace-3.0.1-py3-none-any.whl
  • Upload date:
  • Size: 16.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for oracletrace-3.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8414a700eace0363602b08400778ef042cd22fb535f4c4a84af192f6c241adc0
MD5 45d554fb20ae76a46fea556278346422
BLAKE2b-256 e782cf00d093d657a7e455e2efb684e12a08eef5e7d5724ffbcbf3cc18bebe3b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page