
Em 2018, o Python fortaleceu sua popularidade entre os programadores e entrou no
Top 3 dos idiomas mais populares no github . Mais e mais pessoas estão se mudando para o lado positivo ... ou seja, Python. Apareceu um número ainda maior de desenvolvedores que estão interessados nesse idioma e estão desenvolvendo seus projetos com sua ajuda. Uma das áreas populares do Python é o desenvolvimento web. Eu gostaria que não apenas o processo de desenvolvimento fosse conveniente e rápido, mas também os próprios projetos possam se orgulhar de velocidade e estabilidade do trabalho.
O Python possui muitas estruturas que salvam o programador de operações de rotina e permitem que você se concentre na solução de problemas. Em 2018, as estruturas existentes foram atualizadas e novas ferramentas apareceram.
Portanto, decidimos compilar uma análise comparativa de estruturas populares que não perderão, esperamos, sua relevância ao longo de 2019 e determinar a mais rápida delas.
Participantes do teste
Versão: 2.1.4
Descrição: o processador mais popular para Python, que prontamente resolve muitos problemas (painel de administração, autorização, log, ORM etc.). Isso simplifica a vida do desenvolvedor, mas se priorizarmos a velocidade do trabalho, às vezes esse processador é contra nós e isso afeta a produtividade. Por esse motivo, ele provavelmente não aceitará a nomeação do Fastest Python Web Framework em 2019.
Versão: 1.0.2
Descrição: o framework Python mais popular (até o Django supera as estrelas no GitHub). Uma escolha popular em casos de desenvolvimento de pequenos projetos que não precisam dos bolos que estão no Django. Permite implantar rapidamente o aplicativo. Talvez mais rápido que o Django em termos de velocidade, mas tem muito pouca funcionalidade pronta para uso.
Versão: 3.5.1
Descrição: Uma estrutura Python assíncrona muito atraente. Possui uma versão cliente e servidor, que libera significativamente suas mãos durante o desenvolvimento. Possui solicitações assíncronas muito convenientes da versão do cliente, bem como indicadores muito bons da velocidade do servidor com um grande número de solicitações. Definitivamente deve entrar entre os três primeiros.
Versão: 18.12
Descrição: podemos dizer que este é um "frasco multithreaded" com todas as consequências. Por esse motivo, achamos que os resultados devem ser muito bons.
Versão: 5.1.1
Descrição: um veterano assíncrono do movimento Python, estabelecendo a tendência de assincronia em 2010. Não perde a relevância e recebeu a 5ª versão em 2018. Limite de entrada bastante alto para iniciantes. Popular entre os pitãoistas da velha escola, e pensamos por um bom motivo. Deve mostrar bons resultados.
Versão testada: não há versões no GitHub
Descrição: uma estrutura promissora que apareceu em junho de 2018 e nos últimos seis meses ganhou mais de 4000 estrelas. Possui medições de desempenho impressionantes no GitHub. Pensamos que o Vibora seria o favorito da nossa corrida, mas, infelizmente, devido à falta de capacidade de rodar no Python> = 3.7 e à falta de uma versão estável do framework, excluímos o Vibora.
No GitHub, os desenvolvedores prometem um Vibora "radicalmente novo" em breve. Vamos ver o que eles fazem e não se esqueça de escrever sobre isso.
Metodologia de teste
O teste foi realizado no Apple iMac 27 '' Retina 5K 2017, CPU: 3.5GHz i5, RAM: 8GB, 1000GB Fusion Drive, OSX 10.14.2 usando o utilitário
WRK :
wrk -t12 -c400 -d30s http://127.0.0.1:8080/db/
Os testes foram conduzidos no Python 3.7.2. Todas as estruturas foram lançadas usando
Gunicorn com dois trabalhadores. Talvez em alguns casos, o uso de
uwsgi tenha afetado os resultados, mas como estabelecemos o objetivo de testar estruturas, e não como executá-las, decidimos negligenciar isso.
Tivemos apenas um tipo de teste: DB Test, no qual obtemos dados de string do banco de dados e os retornamos como uma resposta html (1 entrada em 79 bytes). O Postgres 11 foi usado como banco de dados, o
Psycopg2 como driver de acesso ao banco de dados para estruturas síncronas e
asyncpg para estruturas assíncronas.
As bibliotecas para estruturas assíncronas decidiram usar o
uvloop como um loop de eventos.
Resultados
Pedidos por segundo

Cargos de liderança bastante esperados por aiohttp e Sanic, mas resultados inesperados do Tornado.
Transferência de dados por segundo (Kb)

O Django está muito atrasado na quantidade de dados transferidos por segundo.
Tempo médio de solicitação (ms)

Mais uma vez, desagradavelmente surpreende o Tornado, do qual inicialmente confiávamos. Impressionante é o Flask, que, em média, o tempo de consulta compete com líderes em potencial.
Tempo máximo de solicitação (s)

Todos os "experimentais" mostraram quase os mesmos resultados para o tempo máximo de consulta. Tudo, como esperávamos.
Resultados finais
12 tópicos
400 conexões
| Média | Máx. | Pedidos / s | Transferência / s (KB) |
Latência (ms) | Req / s | Latência (ms) | Req / s |
Django | 147,99 | 120,91 | 1,98 | 640 | 425,71 | 78,99 |
Balão | 186,8 | 65,65 | 1,75 | 280 | 546,2 | 127,48 |
aiohttp | 165,07 | 247,16 | 1,98 | 585 | 1966.28 | 439,72 |
Sanic | 194,8 | 170,85 | 1,98 | 470 | 1520,9 | 292,6 |
Tornado | 279,3 | 101,71 | 1,74 | 272 | 778,75 | 222,07 |
Sumário
Aiohttp: líder de desempenho no início de 2019. Se sua tarefa requer um desempenho final, você deve examiná-la mais de perto. Além disso, você pode experimentar as opções de inicialização do aiohttp para extrair ainda mais dela. Possui uma versão do cliente que permite fazer solicitações assíncronas sem bibliotecas adicionais. Portanto, para implementar nosso novo serviço altamente carregado, nós o escolhemos.
Sanic: A popularidade da estrutura vai além de seu desempenho. Um milagre não aconteceu e ultrapassar o líder não funcionou. Juntamente com o tópico no Reddit sobre questões de segurança - não usaríamos o Sanic agora e esperamos a ação dos desenvolvedores.
Tornado: "Decepção do ano". Em conexão com os resultados - não acreditamos que o Tornado deva ser escolhido para a implementação de novos projetos. Esperamos que os desenvolvedores criem algo e corrijam a situação.
O Django mostrou o resultado esperado. Adoramos o Django por suas características e por nos livrar da rotina, e não pela velocidade do trabalho. Uma comunidade extensa, um grande número de materiais na Web, um grande número de projetos implementados em domínio público - tudo isso a torna atraente para iniciantes. Se tivéssemos a tarefa de desenvolver rapidamente o MVP de um serviço Web típico, o escolheríamos em 2019.
O frasco também mostrou o resultado esperado. Ignorou o Django devido ao fato de não ter uma funcionalidade tão rica pronta para uso. Não atingi a velocidade de estruturas assíncronas. Nós o escolheríamos em 2019 para a implementação de pequenos projetos de animais de estimação ou quando a velocidade já for importante, mas ainda não há desejo de lidar com estruturas assíncronas.
Você pode ver todos os arquivos de benchmark de origem no repositório do
Python Frameworks Benchmark .