Ini mungkin pertanyaan sepele, tetapi bagaimana cara saya memparalelkan loop berikut dalam python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Saya tahu cara memulai utas tunggal dengan Python tapi saya tidak tahu cara "mengumpulkan" hasilnya.
Berbagai proses juga akan baik-baik saja - apa pun yang paling mudah untuk kasus ini. Saya menggunakan Linux saat ini tetapi kode harus berjalan di Windows dan Mac juga.
Apa cara termudah untuk memparalelkan kode ini?
sumber
calc_stuff
?multiprocessing
modul untuk contoh yang lebih komprehensif.Pool.map()
pada dasarnya bekerja sepertimap()
, tetapi secara paralel.Untuk memparalelkan simpel untuk loop, joblib membawa banyak nilai untuk penggunaan multiprosesor secara baku. Tidak hanya sintaks pendek, tetapi juga hal-hal seperti pengelompokan iterasi transparan ketika mereka sangat cepat (untuk menghapus overhead) atau menangkap traceback dari proses anak, untuk memiliki pelaporan kesalahan yang lebih baik.
Penafian: Saya adalah penulis asli joblib.
sumber
Saya sangat suka
concurrent.futures
untuk ini, tersedia dalam Python3 sejak versi 3.2 - dan via backport ke 2.6 dan 2.7 di PyPi .Anda dapat menggunakan utas atau proses dan menggunakan antarmuka yang sama persis.
Multiprocessing
Masukkan ini ke dalam file - futuretest.py:
Dan inilah hasilnya:
Multithreading
Sekarang ubah
ProcessPoolExecutor
menjadiThreadPoolExecutor
, dan jalankan modul lagi:Sekarang Anda telah melakukan multithreading dan multiprocessing!
Catat kinerja dan gunakan keduanya bersama-sama.
Pengambilan sampel terlalu kecil untuk membandingkan hasilnya.
Namun, saya menduga multithreading akan lebih cepat daripada multiprocessing secara umum, terutama pada Windows, karena Windows tidak mendukung forking sehingga setiap proses baru harus mengambil waktu untuk diluncurkan. Di Linux atau Mac mereka mungkin akan lebih dekat.
Anda dapat membuat sarang banyak utas di dalam beberapa proses, tetapi disarankan untuk tidak menggunakan beberapa utas untuk memulai beberapa proses.
sumber
Di atas berfungsi dengan baik di mesin saya (Ubuntu, paket joblib sudah diinstal sebelumnya, tetapi dapat diinstal melalui
pip install joblib
).Diambil dari https://blog.dominodatalab.com/simple-parallelization/
sumber
Ada beberapa keuntungan menggunakan Ray :
Dalam kasus Anda, Anda bisa menjalankan Ray dan mendefinisikan fungsi jarak jauh
dan kemudian memohonnya secara paralel
Untuk menjalankan contoh yang sama pada sebuah cluster, satu-satunya baris yang akan berubah adalah panggilan ke ray.init (). Dokumentasi yang relevan dapat ditemukan di sini .
Perhatikan bahwa saya membantu mengembangkan Ray.
sumber
Ini adalah cara termudah untuk melakukannya!
Anda dapat menggunakan asyncio . (Dokumentasi dapat ditemukan di sini ). Ini digunakan sebagai dasar untuk beberapa kerangka kerja asynchronous Python yang menyediakan jaringan dan server web berkinerja tinggi, pustaka koneksi basis data, antrian tugas terdistribusi, dll. Ditambah itu memiliki API level tinggi dan level rendah untuk mengakomodasi segala jenis masalah .
Sekarang fungsi ini akan dijalankan secara paralel setiap kali dipanggil tanpa meletakkan program utama ke dalam status menunggu. Anda dapat menggunakannya untuk memparalelkan untuk loop juga. Ketika dipanggil untuk loop, meskipun loop berurutan tetapi setiap iterasi berjalan secara paralel dengan program utama segera setelah penerjemah tiba di sana. Misalnya:
Ini menghasilkan output sebagai berikut:
sumber
wrapped()
dan itu seharusnya**kwargs
bukan*kwargs
mengapa Anda tidak menggunakan utas, dan satu mutex untuk melindungi satu daftar global?
perlu diingat, Anda akan secepat thread paling lambat Anda
sumber
Saya menemukan
joblib
sangat berguna dengan saya. Silakan lihat contoh berikut:n_jobs = -1: gunakan semua core yang tersedia
sumber
joblib
.Katakanlah kita memiliki fungsi async
Itu perlu dijalankan pada array yang besar. Beberapa atribut sedang diteruskan ke program dan beberapa digunakan dari properti elemen kamus dalam array.
sumber
Lihatlah ini;
http://docs.python.org/library/queue.html
Ini mungkin bukan cara yang tepat untuk melakukannya, tetapi saya akan melakukan sesuatu seperti;
Kode aktual;
Semoga itu bisa membantu.
sumber
Ini bisa berguna ketika menerapkan komputasi multiprosesor dan paralel / terdistribusi dalam Python.
Tutorial YouTube tentang cara menggunakan paket techila
Techila adalah middleware komputasi terdistribusi, yang terintegrasi langsung dengan Python menggunakan paket techila. Fungsi persik dalam paket dapat berguna dalam memparalelkan struktur loop. (Cuplikan kode berikut berasal dari Forum Komunitas Techila )
sumber
terima kasih @iuryxavier
sumber
contoh yang sangat sederhana dari pemrosesan paralel adalah
sumber