Fast, accurate static call graph analysis for Python.
No runtime required. JSON output for humans and machines.
$ git clone https://github.com/nwyin/pycg-rs && cd pycg-rs $ cargo build --release $ target/release/pycg analyze src/myapp/ --format json
Python source
# app/service.py
from app.db import get_user
from app.auth import verify_token
class UserService:
def get_profile(self, token):
user = verify_token(token)
return get_user(user.id)
# app/db.py
def get_user(user_id):
...
# app/auth.py
def verify_token(token):
...
What pycg-rs finds
$ pycg callees get_profile src/app/ --match suffix
app.service.UserService.get_profile
→ app.auth.verify_token
→ app.db.get_user
Accuracy measured on 116 fixture expectations across 18 categories. Speed measured on real open-source projects (single-threaded, cold). Limitations documented here.
| pycg-rs | jarviscg | pyan3 | PyCG | |
|---|---|---|---|---|
| Accuracy (fixtures) | 132/132 (100%) | 49/63 (78%) | 33/63 (52%) | crashes on 3.12+ |
| Speed (requests) | 34 ms | ~400 ms | ~700 ms | N/A |
| Speed (fastapi) | 164 ms | ~1.8 s | crashes | N/A |
| Speed (pydantic) | 540 ms | ~4.2 s | crashes | N/A |
| Language | Rust | Python | Python | Python |
| JSON output | yes (7 schemas) | PyCG-compat | no | yes |
| Maintained | active | active | maintained | archived |
Analysis of 9 popular open-source Python projects. Click column headers to sort.
| Project | .py files | Analyzed | Nodes | Classes | Functions | Edges | Time | Status |
|---|---|---|---|---|---|---|---|---|
| black | 25 | 25 | 505 | 45 | 435 | 1785 | 58ms | ✓ |
| click | 17 | 17 | 622 | 85 | 520 | 1740 | 48ms | ✓ |
| fastapi | 48 | 48 | 450 | 104 | 298 | 1354 | 40ms | ✓ |
| flask | 24 | 24 | 439 | 53 | 362 | 1022 | 31ms | ✓ |
| httpx | 23 | 23 | 544 | 87 | 434 | 1621 | 43ms | ✓ |
| pydantic | 104 | 104 | 2293 | 428 | 1761 | 7737 | 306ms | ✓ |
| pytest | 80 | 80 | 2292 | 256 | 1956 | 8433 | 234ms | ✓ |
| requests | 19 | 19 | 318 | 52 | 247 | 949 | 25ms | ✓ |
| rich | 100 | 100 | 1169 | 181 | 888 | 3921 | 115ms | ✓ |
Module-level view — functions and classes collapsed into their owning module. Generated with pycg analyze --modules --colored.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
SVG not available (graphviz not found?)
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.
Module-level dependency graph — each node is a Python module, edges represent cross-module calls or imports.