Python Interpreter zużywa tylko 12% mocy procesora

26

Używam Pythona na Ubuntu do analizy tekstu. Pomimo dużej ilości pracy program wykonuje użycie procesora, jak pokazano na monitorze systemowym, stale wynosi 12%.

Zmieniłem priorytet programu z Normalna, Very Highale to nie przyniosło efektu.

Co ogranicza wykorzystanie procesora przez mój program python i jak mogę to zmienić, aby program mógł zużywać więcej mocy procesora?

Matthias Herrmann
źródło

Odpowiedzi:

73

Zakładam, że masz procesor z 8 wirtualnymi rdzeniami (prawdopodobnie czterordzeniowy z hiperwątkowością)? Oznacza to, że jeden w pełni obciążony wątek procesora / wirtualny rdzeń wynosi 12,5% całkowitego obciążenia.

Interpretator Python jest aplikacją, która domyślnie działa tylko jako jeden proces i dlatego nie może korzystać z więcej niż jednego wirtualnego rdzenia. Nawet jeśli kod, który uruchamiasz z nim, korzysta z wielowątkowości, nadal będzie używał tylko jednego wątku procesora / wirtualnego rdzenia, z powodu GIL (globalnej blokady interpretera) .

Tylko wtedy, gdy używa programu Python wieloprocesorowe , które w rzeczywistości zaczyna się wiele wystąpień interpreter Pythona i pozwala im wykonywać twoje zadania prawdziwie równoległe, można skorzystać z wielu wirtualnych rdzeni / wątków procesora. (Jak zauważył @SargeBorsch w swoim komentarzu, istnieją również zaawansowane sposoby osiągnięcia tego bez wieloprocesowego przetwarzania, ale zwykle nie jest to coś, co szybko piszesz sam.)

Bajt Dowódca
źródło
To naprawdę ma sens. Tak, mam czterordzeniowy z 4 rdzeniami (8 rdzeni wirtualnych). Ty
Matthias Herrmann
9
@MatthiasHerrmann Możesz rozważyć monitorowanie systemu, aby pokazać, na jakim procencie pracuje każdy procesor. W ten sposób mogłeś zobaczyć tylko 1 z 8 procesorów na 100%. Oto jeden wątek w AU na ten temat: odpowiednik „gadżetów” systemu Windows (do korzystania z Wi-Fi i procesora)?
WinEunuuchs2Unix
7
Nieprawda, można dobrze wykorzystać wszystkie rdzenie z pojedynczego procesu Pythona. Wystarczy wywołać kod C i zwolnić GIL. I wiele istniejących bibliotek robi dokładnie to (na przykład numpy).
Sarge Barszcz
2
Lub użyj Jythonlub IronPython, które nie mają GIL.
Stop Harming Monica,
19

Inną możliwością, mniej prawdopodobną w tym przypadku, jest to, że program jest związany z dyskiem, tj. Odczytuje i zapisuje na / z dysku, który jest wolny, a procesor czeka na dysk.

jmmcd
źródło
5
spróbuj iotopmonitorować programy powiązane z iowait
cat
1
Albo sam kod jest synchroniczny i blokuje.
Zydnar
To był mój błąd bardzo dziękuję
Fipsi