Używam Pythona do wykonywania niektórych algorytmów i bez względu na to, jakiego Pythona używam, i wypróbowałem wiele wersji, użycie procesora wzrasta do 25%. Dlaczego Python nie wykorzystuje reszty zasobów procesora? Zmieniłem priorytet usługi z normalnego na wysoki, a później na czas rzeczywisty, z restartami pomiędzy, ale nic się nie zmieniło.
Czy istnieje sposób, aby Python wykorzystał 50% lub więcej mojego procesora?
Odpowiedzi:
Mówiąc najprościej, uruchamiasz aplikację jednowątkową w systemie z 4 rdzeniami logicznymi - jako taki masz jeden proces, wykorzystujący cały rdzeń.
Będziesz (i to nie jest trywialne) przepisać algorytm, aby był wielowątkowy, lub sprawdź, czy możesz po prostu uruchomić 2 lub więcej instancji na określonych rdzeniach, aby wykorzystać więcej procesora. Nie ma innego wyjścia.
źródło
Język Python wyprzedza procesory wielordzeniowe, więc nie jest dziwne, że nie używa ich natywnie.
Ponadto nie wszystkie programy mogą korzystać z wielu rdzeni. Obliczenia wykonywane w krokach, w których następny krok zależy od wyników poprzedniego kroku, nie będą szybsze przy użyciu większej liczby rdzeni. Problemy, które można wektoryzować (stosując to samo obliczenie do dużych tablic danych), można stosunkowo łatwo zastosować za pomocą wielu rdzeni, ponieważ poszczególne obliczenia są niezależne.
Kiedy wykonujesz wiele obliczeń, zakładam, że używasz numpy ? Jeśli nie, sprawdź to. Jest to rozszerzenie napisane w C, które może wykorzystywać zoptymalizowane biblioteki algebry liniowej, takie jak ATLAS. Może znacznie przyspieszyć obliczenia numeryczne w porównaniu ze standardowym Pythonem.
To powiedziawszy, istnieje kilka sposobów używania wielu rdzeni w Pythonie.
multiprocessing
moduł.multiprocessing.Pool
Klasa zapewnia wektoryzacji na wielu procesorach zmap()
i pokrewnych metod. Jest tu jednak kompromis. Jeśli musisz przesyłać duże ilości danych między procesami, to narzut ten może zniweczyć przewagę wielu rdzeni.Zauważ, że
threading
moduł nie jest tak użyteczny pod tym względem. Aby uprościć zarządzanie pamięcią, globalna blokada interpretera („GIL”) wymusza, aby tylko jeden wątek na raz mógł wykonywać kod bajtowy pythona. Jednak moduły zewnętrzne, takie jak numpy, mogą używać wielu wątków wewnętrznie.źródło