lançamento do sistema de gerenciamento de pacotes , usado na distribuição . O tópico apresentado resumiu o trabalho de longo prazo na transição para Python 3 e o fim do suporte para Python 2.7.
Além do fim do suporte ao Python 2.7, outra mudança importante foi a inclusão do , o que permitiu agilizar em 50-60% os cálculos relacionados à determinação de dependências. Curiosamente, alguns desenvolvedores sugeriram reescrever o código de resolução de dependências em C/C++ ou Go para acelerar sua operação, mas conseguiram resolver o problema existente com pouco esforço.
A criação de perfil do código existente mostrou que a maior parte do tempo de cálculo foi gasto chamando as funções use_reduce e catpkgsplit com um conjunto repetido de argumentos (por exemplo, a função catpkgsplit foi chamada de 1 a 5 milhões de vezes). Para agilizar, foi utilizado o cache dos resultados dessas funções por meio de dicionários. A melhor opção para armazenamento em cache era a função lru_cache integrada, mas ela só estava disponível em versões do Python a partir da 3.2. Para compatibilidade com versões anteriores, um stub foi adicionado para substituir lru_cache, mas a decisão de descontinuar o suporte para Python 2.7 no Portage 3.0 simplificou bastante a tarefa e tornou possível dispensar esta camada.
O uso do cache reduziu o tempo de execução da operação “emerge -uDvpU —with-bdeps=y @world” no laptop ThinkPad X220 de 5 minutos e 20 segundos para 3 minutos e 16 segundos (63%). Testes em outros sistemas mostraram um aumento de desempenho de pelo menos 48%.
O desenvolvedor que preparou a mudança também tentou implementar um protótipo do código de resolução de dependências em C++ ou Rust, mas a tarefa era muito difícil porque exigia a portabilidade de uma grande quantidade de código, e era duvidoso que o resultado valesse o esforço. .
Fonte: opennet.ru
