Сначала стоит разобраться в том, что вообще такое
генераторы. За этим лучше всего обратиться к учебнику. Потом стоит погуглить про
кооперативную многозадачность. После разобраться в значении термина
асинхронность и её базовых принципах. Хорошо просветляют доклады Дэвида Бизли - "
Generator Tricks for Systems Programmers", "
A Curious Course on Coroutines and Concurrency" и "
https://www.dabeaz.com/finalgenerator/index.html". Понимание всего вышеперечисленного позволит понять как именно работают
yield from и
@asyncio.coroutine, в чём их польза и зачем появилась потребность в
async и
await.
Грубо говоря, в Python есть генераторы, которые являются обобщённым механизмом, с помощью которого можно реализовать многое, включая асинхронность. Но универсальное быстрым не бывает, поэтому в интерпретатор добавили два ключевых слова, делающих примерно то же самое, что и
yield from с
@asyncio.coroutine, но специализированные только для этого и выполняющие свою работу на более низком уровне, а значит быстрее.