Sebelum mencari alat "kotak hitam", yang dapat digunakan untuk menjalankan fungsi python paralel "generik", saya akan menyarankan untuk menganalisis bagaimana my_function()
dapat diparalelkan dengan tangan.
Pertama, bandingkan waktu eksekusi my_function(v)
untuk for
overhead python loop: [C] Python for
loop sangat lambat, sehingga waktu yang dihabiskan my_function()
bisa diabaikan.
>>> timeit.timeit('pass', number=1000000)
0.01692986488342285
>>> timeit.timeit('for i in range(10): pass', number=1000000)
0.47521495819091797
>>> timeit.timeit('for i in xrange(10): pass', number=1000000)
0.42337894439697266
Pemeriksaan kedua jika ada implementasi vektor sederhana my_function(v)
yang tidak memerlukan loop:F[:] = my_vector_function(X)
(Dua poin pertama ini cukup sepele, maafkan saya jika saya menyebutkannya di sini hanya untuk kelengkapan.)
Ketiga dan yang paling poin penting, setidaknya untuk implementasi CPython, adalah untuk memeriksa apakah my_function
menghabiskan sebagian besar itu waktu di dalam atau di luar yang juru kunci global yang , atau GIL . Jika waktu dihabiskan di luar GIL, maka threading
modul perpustakaan standar harus digunakan. ( Ini contohnya). BTW, orang bisa menganggap menulis my_function()
sebagai ekstensi C hanya untuk melepaskan GIL.
Akhirnya, jika my_function()
tidak merilis GIL, seseorang dapat menggunakan multiprocessing
modul .
Referensi: Python docs tentang Eksekusi Bersamaan , dan intro numpy / scipy pada pemrosesan paralel .