Penerjemah Python hanya menggunakan Daya CPU 12%

26

Saya menggunakan python di ubuntu untuk analisis teks. Terlepas dari jumlah pekerjaan yang berat, program ini melakukan penggunaan CPU seperti yang ditunjukkan dalam monitor sistem tetap konsisten sebesar 12%.

Saya mengubah prioritas program dari Normalmenjadi Very Hightetapi itu tidak berpengaruh.

Apa yang membatasi jumlah penggunaan CPU yang bisa didapatkan oleh program python saya dan bagaimana cara mengubahnya, sehingga program dapat menggunakan lebih banyak daya cpu?

Matthias Herrmann
sumber

Jawaban:

73

Saya berasumsi Anda memiliki CPU dengan 8 core virtual (quad-core dengan hyper-threading mungkin)? Itu berarti satu utas CPU penuh / inti virtual sama dengan total beban 12,5%.

Penerjemah Python adalah aplikasi yang hanya berjalan sebagai satu proses tunggal secara default dan karenanya tidak dapat memanfaatkan lebih dari satu inti virtual. Sekalipun kode yang Anda jalankan dengannya menggunakan multithreading, ia hanya akan menggunakan satu CPU thread / virtual core, karena GIL (global interpreter lock) .

Hanya jika program Python Anda menggunakan multiprocessing , yang sebenarnya memulai beberapa contoh interpreter Python dan memungkinkan mereka melakukan tugas-tugas Anda secara paralel, Anda dapat memanfaatkan beberapa inti virtual / utas CPU. (Seperti yang @SargeBorsch tunjukkan dalam komentarnya, ada juga beberapa cara canggih untuk mencapai hal ini tanpa multiprosesor, tapi itu biasanya bukan sesuatu yang Anda cepat tulis sendiri.)

Komandan Byte
sumber
Itu sebenarnya sangat masuk akal. Ya saya memiliki quad-core dengan 4 core (8 core virtual). Ty
Matthias Herrmann
9
@MatthiasHerrmann Anda dapat mempertimbangkan monitor sistem untuk menunjukkan kepada Anda berapa persen setiap CPU beroperasi. Dengan begitu Anda bisa melihat hanya 1 dari 8 CPU yang 100%. Berikut adalah satu utas dalam AU tentang subjek: Windows "gadget" setara (untuk penggunaan wifi dan cpu)?
WinEunuuchs2Unix
7
Tidak benar, mungkin untuk menggunakan semua inti dari proses python tunggal dengan baik. Seseorang hanya perlu memanggil kode C dan melepaskan GIL. Dan banyak perpustakaan yang ada melakukan hal itu (numpy misalnya).
Sarge Borsch
2
Atau gunakan Jythonatau IronPython, yang tidak memiliki GIL.
Stop Harming Monica
19

Kemungkinan lain, kurang mungkin dalam hal ini, adalah bahwa program ini terikat disk, yaitu membaca dan menulis ke / dari disk yang lambat, dan CPU sedang menunggu disk.

jmmcd
sumber
5
cobalah iotopuntuk memonitor program yang terikat ke iowait
cat
1
Atau kodenya sendiri sinkron dan memblokir.
Zydnar
Itu kesalahan saya, terima kasih banyak
Fipsi