api-design
Design or review REST and GraphQL API interfaces. Use when asked to design an API, review endpoint structure, define…
Profile and optimize application performance. Use when asked to improve speed, reduce latency, fix memory leaks, find bottlenecks, or optimize a slow function or endpoint.
$ npx -y skills add agulli/atlas-agents --skill performance-profiling --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/performance-profilingContext preview
The summary Claude sees to decide when to auto-load this skill.
Profile and optimize application performance. Use when asked to improve speed, reduce latency, fix memory leaks, find bottlenecks, or optimize a slow function or endpoint.
name: performance-profiling description: Profile and optimize application performance. Use when asked to improve speed, reduce latency, fix memory leaks, find bottlenecks, or optimize a slow function or endpoint. license: MIT compatibility: Requires python 3.10+ or node 18+
You do not optimize what you have not measured. Every performance investigation starts with a profiler, not a hypothesis.
1. **Establish a baseline.** Before changing anything, measure the current performance:
import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
result = slow_function(data)
pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats(20) # Top 20 by cumulative time
print(s.getvalue())2. **Read the profiler output.** Identify the top 3 functions by cumulative time. Do not optimize anything that is NOT in the top 3 — this is Amdahl's Law in practice.
3. **Form ONE hypothesis** for why the top bottleneck is slow. Common causes, in order of frequency:
4. **Apply ONE change.** The smallest possible change that addresses the hypothesis. Do not refactor the entire module.
5. **Measure again.** Compare against the baseline. Report the improvement as a percentage.
6. **Repeat.** If there is still a performance gap, return to step 2 with the updated profile.
**N+1 query fix:**
# Before: queries once per user
for user in users:
user.orders = db.query(f"SELECT * FROM orders WHERE user_id={user.id}")
# After: one query for all users
user_ids = [u.id for u in users]
orders = db.query("SELECT * FROM orders WHERE user_id = ANY(%s)", [user_ids])
orders_by_user = defaultdict(list)
for o in orders: orders_by_user[o.user_id].append(o)
for user in users: user.orders = orders_by_user[user.id]**Caching a pure function:**
from functools import lru_cache
@lru_cache(maxsize=512)
def expensive_computation(input_id: int) -> dict:
...| Excuse | Rebuttal | |--------|----------| | "I know what the bottleneck is without profiling" | You don't. Everyone thinks they know. Profile first, always. | | "Let me optimize the whole module while I'm here" | Scope creep disguised as diligence. Fix the top bottleneck, measure, then decide if more work is needed. | | "It's fast enough on my machine" | Production data is 100x larger. Profile with production-scale data. |
This repository contains the source code, examples, and project implementations for the book "Hands-on AI Agents" — a practical, code-first guide to building AI agents and, more importantly, putting them into production.
Design or review REST and GraphQL API interfaces. Use when asked to design an API, review endpoint structure, define…
Perform a structured security and quality audit on source code. Use when asked to review code, audit a pull request, check for…
Design, build, or debug data processing pipelines. Use when asked to process a dataset, transform data, build an ETL pipeline,…
Safely run database schema migrations. Use when asked to update database schema, add columns, create tables, run alembic, or…
Audit project dependencies for vulnerabilities, license issues, and bloat. Use when asked to check dependencies, audit packages,…
Execute a structured deployment to staging or production. Use when asked to deploy, ship, release, push to production, or promote…