Understand how the GIL shapes the trade-offs between threads, multiprocessing, and asyncio.
You have a CPU-bound task that performs heavy numerical computation in pure Python. Under CPython (with the GIL), which approach will give the best parallel speedup on a multi-core machine, and why?