Rumah > Artikel > pembangunan bahagian belakang > Cara menggunakan Numba untuk mempercepatkan pengiraan berangka dalam program Python
Cara menggunakan Numba untuk mempercepatkan pengiraan berangka program Python
Pengenalan:
Python ialah bahasa yang sangat fleksibel dan mudah digunakan apabila ia berkaitan dengan pengiraan berangka. Walau bagaimanapun, oleh kerana Python ialah bahasa yang ditafsirkan, ia berjalan agak perlahan, terutamanya dalam tugas pengkomputeran berangka intensif. Untuk meningkatkan prestasi program Python, kami boleh menggunakan beberapa alat pengoptimuman dan perpustakaan. Satu perpustakaan yang sangat berkuasa ialah Numba, yang menggunakan kompilasi tepat dalam masa untuk mempercepatkan pengiraan berangka tanpa mengubah struktur kod Python. Artikel ini akan memperkenalkan cara menggunakan Numba untuk mempercepatkan pengiraan berangka program Python.
Pasang Numba:
Untuk mula menggunakan Numba, anda perlu memasangnya terlebih dahulu. Numba boleh dipasang dengan menggunakan pengurus pakej pip:
pip install numba
Penggunaan asas:
Cara paling mudah untuk menggunakan Numba ialah menggunakan penghias untuk mengaplikasikannya pada fungsi yang perlu dipercepatkan. Numba menyokong dua penghias utama: @jit
dan @njit
. @jit
Penghias boleh digunakan pada fungsi, menyusunnya kepada kod mesin untuk meningkatkan prestasi. Penghias @njit
ialah pintasan untuk @jit(nopython=True)
, yang menukar fungsi kepada kod mesin tulen tanpa menggunakan penterjemah Python. Berikut ialah contoh mudah: @jit
和@njit
。@jit
装饰器可以应用于函数,将其编译为机器码以提高性能。@njit
装饰器是@jit(nopython=True)
的一个快捷方式,它会将函数转换为不使用Python解释器的纯机器码。下面是一个简单的例子:
from numba import jit @jit def sum_array(arr): total = 0 for i in range(len(arr)): total += arr[i] return total arr = [1, 2, 3, 4, 5] result = sum_array(arr) print(result)
在上面的例子中,sum_array
函数使用@jit
装饰器进行了优化。Numba会自动推断函数中变量的类型,并将其编译为机器码。这样,函数的性能会得到大幅提升。
类型推断和类型注解:
为了最大程度地提高性能,Numba需要确切地了解函数和变量的类型。在上面的例子中,Numba可以正确地推断出sum_array
函数的类型。然而,在一些情况下,Numba可能无法自动推断类型,这时我们需要使用类型注解来帮助Numba准确地编译函数。下面是一个使用类型注解的例子:
from numba import jit @jit('float64(float64[:])') def sum_array(arr): total = 0 for i in range(len(arr)): total += arr[i] return total arr = [1.0, 2.0, 3.0, 4.0, 5.0] result = sum_array(arr) print(result)
在上面的例子中,我们通过@jit('float64(float64[:])')
注解明确告诉Numbasum_array
函数的输入和输出类型。这样,Numba可以更好地优化函数。
并行计算:
Numba还支持并行计算,可以利用多核CPU提高计算性能。要使用并行计算,需要将@jit
装饰器的并行参数设置为True
:
from numba import njit @njit(parallel=True) def parallel_sum(arr): total = 0 for i in range(len(arr)): total += arr[i] return total arr = [1, 2, 3, 4, 5] result = parallel_sum(arr) print(result)
在上面的例子中,parallel_sum
函数通过将@njit(parallel=True)
应用于函数上来实现并行计算。这样就可以同时利用多个CPU核心来加速计算。
使用Numba编译生成的代码:
有时候我们可能想要查看Numba编译生成的机器码。可以通过inspect_llvm
和inspect_asm
函数来查看Numba生成的LLVM代码和汇编代码:
from numba import jit, inspect_llvm, inspect_asm @jit def sum_array(arr): total = 0 for i in range(len(arr)): total += arr[i] return total arr = [1, 2, 3, 4, 5] result = sum_array(arr) print(inspect_llvm(sum_array)) # 查看LLVM代码 print(inspect_asm(sum_array)) # 查看汇编代码
在上面的例子中,我们使用inspect_llvm
和inspect_asm
函数来查看sum_array
rrreee
Dalam contoh di atas, fungsi sum_array
dioptimumkan menggunakan penghias @jit
. Numba secara automatik menyimpulkan jenis pembolehubah dalam fungsi dan menyusunnya ke dalam kod mesin. Dengan cara ini, prestasi fungsi akan bertambah baik.
sum_array
. Walau bagaimanapun, dalam beberapa kes, Numba mungkin tidak dapat membuat kesimpulan jenis secara automatik Dalam kes ini, kami perlu menggunakan anotasi jenis untuk membantu Numba menyusun fungsi dengan tepat. Berikut ialah contoh penggunaan anotasi jenis: sum_array melalui <code>@jit('float64(float64[:])')
anotasi Jenis input dan output fungsi. Dengan cara ini, Numba boleh mengoptimumkan fungsi dengan lebih baik. @jit
kepada True
: 🎜rrreee🎜🎜🎜Dalam contoh di atas, parallel_sum kod >Fungsi melaksanakan pengkomputeran selari dengan menggunakan <code>@njit(parallel=True)
pada fungsi. Ini membolehkan berbilang teras CPU digunakan secara serentak untuk mempercepatkan pengiraan. 🎜inspect_llvm
dan inspect_asm
: 🎜rrreee🎜🎜🎜Dalam contoh di atas, kami menggunakan inspect_llvm dan <code>inspect_asm
berfungsi untuk melihat kod LLVM dan kod pemasangan bagi fungsi sum_array
. 🎜🎜Kesimpulan: 🎜Menggunakan Numba boleh meningkatkan prestasi pengkomputeran berangka program Python dengan ketara. Dengan hanya menambahkan penghias pada fungsi yang perlu dipercepatkan, kami boleh memanfaatkan ciri kompilasi tepat dalam masa Numba untuk menyusun kod Python menjadi kod mesin yang cekap. Selain itu, Numba juga menyokong inferens jenis, anotasi jenis dan pengkomputeran selari, memberikan lebih banyak pilihan pengoptimuman. Dengan menggunakan Numba, kami boleh memanfaatkan kesederhanaan dan fleksibiliti Python dengan lebih baik sambil mencapai prestasi bahasa pengaturcaraan hampir asli. 🎜🎜Rujukan: 🎜🎜🎜https://numba.pydata.org/🎜🎜https://numba.pydata.org/numba-doc/latest/user/jit.html🎜🎜https://numba.pydata . org/numba-doc/latest/user/examples.html🎜🎜
Atas ialah kandungan terperinci Cara menggunakan Numba untuk mempercepatkan pengiraan berangka dalam program Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!