Комментарии 30
Не нужно было использовать Gunicorn: в документации того же aiohttp написано, что с Gunicorn он работает медленнее.
По бенчмаркам без Gunicorn из первых ссылок в гугле Sanic выходит раза в полтора быстрее чем aiohttp
Что значит "компилируемого"? Там просто все файлы транслируются в C-экстеншены с помощью cython. "Ситонизация" обычного питоновского кода почти не прибавляет к производительности такого кода. А чисто ситоновского оптимизированного кода там нет. Поэтому они и пишут, что:
print('\nNOTE: Cython not installed. '
'Falcon will still work fine, but may run '
'a bit slower.\n')
"a bit slower"
Это и есть "a bit faster" :)
Если бы они переписали код на чистом cython (pyx/pxd), производительность могла бы увеличиться в десятки раз (это, строго говоря, верно для какого-то вычислительного кода на питоне, потому как в случае web-фреймворка всё конечно сложнее). Но именно ситонизация py-кода даёт очень незначительный прирост так как выполняется тупая трансляция в CPython API со всем динамизмом, тогда как код на cython уже статически строго типизирован.
Но ведь aiohttp не фреймворк для разработки сайтов (в отличии от Django). Мне сравнение больше напоминает подводную лодку против карьерного самосвала. Сравнить можно, но имеет ли оно смысл?
В таком тесте корректнее сравнивать время на обработку одного запроса. По этому показателю в этом тесте победил Django.
А если хочется сравнить число запросов в секунду, то надо значительно увеличить число воркеров для синхронных фреймворков. И заодно собрать статистику как от числа воркеров зависит число запросов в секунду и объём потребляемой памяти.
Docker
OSXТак стоп, я правильно понимаю, что это всё ещё и в VirtualBox запускалось?
Увидев результаты Торнадо я сразу понял что тут что то неладное и полез в код.
Короче вы какуето херню потестили.
- Вы не использовали asyncpg для Торнадо а использовали старую momoko которая работает поверх psycopg.
- НО самое главное вы не использовали uvloop вообще! Да даже больше вы не использовали async/await в Торнадо! Вы знаете что собственная реализация ioloop на базе yield и gen.coroutine является депрекейтед!? Вы должны были использовать async/await и asyncpg. В 6 Торнадо вообще не будет старого лупа только тот что в asyncio.
aiohttp: 5681 rps
aiohttp + uvloop: 7780 rps
sanic (default): 6362 rps
sanic (logs off): 20956 rps
Самые быстрые Python веб-фреймворки в 2019