Start here. This is the direct spoken answer to practice first.
Overview
The choice follows the actual call chain, not a belief that async syntax is automatically faster.
I use async def when the handler calls awaitable I/O and use normal def when it must call blocking I/O through synchronous libraries. FastAPI calls async def directly on the event loop, while normal def path operations and dependencies run in a thread pool and are awaited. Putting a blocking database or HTTP call directly inside async def blocks the event loop. CPU-heavy work is not fixed by either choice and usually needs a separate process or bounded worker design.