wydanie systemu zarządzania pakietami , używane w dystrybucji . Przedstawiona gałąź podsumowuje długotrwałą pracę nad przejściem na Pythona 3 oraz zakończeniem wsparcia dla Pythona 2.7.
Oprócz zakończenia wsparcia dla Pythona 2.7, inną ważną zmianą było włączenie , które pozwoliły przyspieszyć obliczenia związane z rozwiązywaniem zależności o 50-60%. Interesujące, że niektórzy deweloperzy proponowali przepisanie kodu rozwiązywania zależności w C/C++ lub Go, aby przyspieszyć jego działanie, ale udało się rozwiązać istniejący problem względnie łatwo.
Profilowanie istniejącego kodu pokazało, że główny czas obliczeń jest wykorzystywany na wywołania funkcji use_reduce i catpkgsplit z powtarzającym się zestawem argumentów (na przykład, funkcja catpkgsplit była wywoływana od 1 do 5 mln razy). Aby przyspieszyć działanie, zastosowano cachowanie wyników tych funkcji z użyciem słowników. Optymalną metodą do przechowywania tego cache'a była wbudowana funkcja lru_cache, dostępna tylko w wersjach Pythona od 3.2. Aby zapewnić kompatybilność z wcześniejszymi wersjami, dodano zamiennik lru_cache, ale decyzja o zakończeniu wsparcia dla Pythona 2.7 w Portage 3.0 znacznie uprościła zadanie i pozwoliła obejść się bez tego pośrednika.
Zastosowanie cache'a pozwoliło skrócić czas wykonania operacji „emerge -uDvpU —with-bdeps=y @world” na laptopie ThinkPad X220 z 5 minut 20 sekund do 3 minut 16 sekund (63%). Testy na innych systemach wykazały wzrost wydajności nie mniejszy niż 48%.
Deweloper przygotowujący tę zmianę próbował również zaimplementować prototyp kodu rozwiązywania zależności w C++ lub Rust, ale zadanie okazało się zbyt skomplikowane, ponieważ wymagało portowania dużej ilości kodu, a także wątpliwe było, że osiągnięty wynik byłby wart poniesionych wysiłków.
Źródło: opennet.ru
