Cara meningkatkan penggunaan CPU Python

21

Saya menggunakan Python untuk menjalankan beberapa algoritma dan tidak peduli Python mana yang saya gunakan, dan saya telah mencoba banyak versi, penggunaan CPU mencapai maks 25%. Mengapa Python tidak memanfaatkan sisa sumber daya CPU saya? Saya mengubah prioritas layanan dari normal ke tinggi dan kemudian ke waktu nyata, dengan restart di antaranya, tetapi tidak ada yang berubah.

Apakah ada cara untuk membuat Python menggunakan 50% atau lebih dari CPU saya?

Christos K.
sumber
adalah cpu Anda multicore cpu?
Journeyman Geek
ya, ini adalah i5-480M dan di panel kontrol> opsi daya> cpu min / max 100%
Christos K.

Jawaban:

20

Sederhananya, Anda menjalankan aplikasi berulir tunggal dalam sistem dengan 4 inti logis - dengan demikian, Anda memiliki satu proses, menggunakan semua inti.

Anda akan (dan ini bukan hal sepele) perlu menulis ulang algoritma menjadi multi-threaded, atau melihat apakah Anda dapat menjalankan 2 instance atau lebih, pada core tertentu untuk menggunakan lebih banyak CPU Anda. Tidak ada jalan lain.

Journeyman Geek
sumber
Saya takut bahwa ini akan menjadi kasus, tetapi dalam diagram penggunaan CPU di windows task manager saya tidak melihat 1 diagram berada di itu pilih saat algoritma dieksekusi, sebaliknya saya melihat semuanya dengan peningkatan yang signifikan.
Christos K.
1
Sistem Anda menyeimbangkan beban antar core. Namun, tidak ada dua core yang digunakan sekaligus.
gronostaj
teman-teman Anda mengkonfirmasi ketakutan saya, sepertinya sudah saatnya saya mulai membaca tentang threading
Christos K.
@ fractal_7: Threading mungkin tidak membawa manfaat yang Anda harapkan. Lihat jawaban saya di bawah ini.
Roland Smith
15

Bahasa Python mendahului CPU multi-core, jadi tidak aneh bahwa ia tidak menggunakannya secara asli.

Selain itu, tidak semua program dapat mengambil untung dari banyak core. Perhitungan yang dilakukan dalam langkah-langkah, di mana langkah selanjutnya tergantung pada hasil langkah sebelumnya, tidak akan lebih cepat menggunakan lebih banyak inti. Masalah yang dapat di- vektor-kan (menerapkan perhitungan yang sama pada array data yang besar) dapat relatif mudah dibuat untuk menggunakan banyak inti karena perhitungan individu bersifat independen.

Ketika Anda melakukan banyak perhitungan, saya berasumsi Anda menggunakan numpy ? Jika tidak, coba lihat. Ini adalah ekstensi yang ditulis dalam C yang dapat menggunakan perpustakaan aljabar linier yang dioptimalkan seperti ATLAS. Ini dapat mempercepat perhitungan numerik secara signifikan dibandingkan dengan Python standar.

Karena itu, ada beberapa cara untuk menggunakan beberapa core dengan python.

  • Built-in adalah multiprocessingmodul. The multiprocessing.Poolkelas menyediakan vektorisasi di beberapa CPU dengan map()dan terkait metode. Ada trade-off di sini. Jika Anda harus mengomunikasikan sejumlah besar data antara proses maka overhead itu mungkin meniadakan keuntungan dari beberapa core.
  • Gunakan bentuk numpy yang cocok. Jika numpy dibangun dengan pustaka ATLAS multithreading, itu akan lebih cepat pada masalah besar.
  • Gunakan modul ekstensi seperti numexpr , python paralel , corepy atau Copenhagen Vector Byte Code .

Perhatikan bahwa threadingmodul ini tidak terlalu berguna dalam hal ini. Agar manajemen memori tetap sederhana, kunci juru bahasa global ("GIL") memberlakukan bahwa hanya satu utas pada satu waktu yang dapat menjalankan bytecode python. Modul eksternal seperti numpy dapat menggunakan beberapa utas secara internal.

Roland Smith
sumber
Sejauh ini saya telah menggunakan python 2.7 ironpython dan mencoba pypy. saya akan memberi kesempatan numpy. tapi saya masih harus membaca sebelum saya dapat menggunakan modul multiprocessing.
Christos K.