Jak zwiększyć użycie procesora przez Python

21

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?

Christos K.
źródło
czy twój procesor jest procesorem wielordzeniowym?
Journeyman Geek
tak, to i5-480M, aw panelu sterowania> opcje zasilania> cpu min / max jest na 100%
Christos K.

Odpowiedzi:

20

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.

Journeyman Geek
źródło
Obawiałem się, że tak się stanie, ale w diagramach użycia procesora w menedżerze zadań systemu Windows nie widzę, aby jeden diagram był wybierany podczas wykonywania algorytmu, przeciwnie, widzę je wszystkie z pewnym znaczącym wzrostem.
Christos K.,
1
Twój system równoważy obciążenie między rdzeniami. Mimo to nie są używane jednocześnie dwa rdzenie.
gronostaj
faceci potwierdził moje obawy, wydaje się, że najwyższy czas zacznę czytać o gwintowania
Christos K.
@ fractal_7: Wątek może nie przynieść oczekiwanych korzyści. Zobacz moją odpowiedź poniżej.
Roland Smith,
15

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.

  • Wbudowany jest multiprocessingmoduł. multiprocessing.PoolKlasa zapewnia wektoryzacji na wielu procesorach z map()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.
  • Użyj odpowiedniej wersji numpy. Jeśli numpy jest zbudowany z wielowątkową biblioteką ATLAS, będzie on szybszy w przypadku dużych problemów.
  • Użyj modułów rozszerzeń, takich jak numexpr , równoległy python , corepy lub Copenhagen Vector Byte Code .

Zauważ, że threadingmoduł 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.

Roland Smith
źródło
Do tej pory używałem ironpython Python 2.7 i próbowałem pypy. dam numpy szansę. ale nadal będę musiał przeczytać, zanim będę mógł skorzystać z dowolnego modułu wieloprocesowego.
Christos K.,