Numba 從零基礎到實戰:解鎖 Python 性能新境界

Numba 從零基礎到實戰:解鎖 Python 性能新境界

一、引言

在 Python 的世界里,性能一直是一個備受關注的話題。Python 以其簡潔易讀的語法和豐富的庫生態,深受開發者喜愛,但在處理一些計算密集型任務時,其執行速度往往差強人意。這時,Numba 就像是一把利劍,能夠顯著提升 Python 代碼的性能。本文將帶你從零基礎開始,逐步深入了解 Numba,最終實現實戰應用。

二、Numba 是什么

Numba 是一個開源的即時編譯器(JIT),由 NVIDIA 開發。它能夠將 Python 函數動態編譯為高效的機器碼,尤其是在處理數值計算和 NumPy 數組時,性能提升顯著。Numba 無需你編寫復雜的 C 或 C++ 代碼,只需在 Python 函數上添加一個裝飾器,就能讓代碼運行得更快。

三、環境搭建

安裝 Numba

使用 pip 安裝 Numba 非常簡單,只需在命令行中運行以下命令:

pip install numba

如果你想使用 GPU 加速功能,還需要安裝 CUDA 工具包(適用于 NVIDIA GPU),并使用以下命令安裝相關依賴:

pip install numba cuda-python

驗證安裝

安裝完成后,我們可以編寫一個簡單的 Python 腳本來驗證 Numba 是否安裝成功:

import numba@numba.jit
def add_numbers(a, b):return a + bresult = add_numbers(3, 5)
print(result)

如果代碼能夠正常運行并輸出結果,說明 Numba 已經安裝成功。

四、Numba 基礎語法

裝飾器 @jit@njit

  • @jit:這是 Numba 中最常用的裝飾器,它可以將函數編譯為機器碼。@jit 會根據函數的內容自動選擇編譯模式,如果函數中只包含 Numba 支持的類型和操作,它會使用 nopython 模式,否則使用 object 模式。
import numba@numba.jit
def square_sum(arr):result = 0for i in range(len(arr)):result += arr[i] ** 2return resultimport numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(square_sum(arr))
  • @njit:等同于 @jit(nopython=True),它強制使用 nopython 模式。在 nopython 模式下,函數不能使用 Python 的動態特性,只能使用 Numba 支持的類型和操作,但編譯后的代碼性能更高。
import numba@numba.njit
def multiply_numbers(a, b):return a * bprint(multiply_numbers(4, 6))

類型簽名

在使用 @jit@njit 時,可以指定函數的類型簽名,這樣可以提高編譯效率。

import numba@numba.jit('float64(float64, float64)')
def divide_numbers(a, b):return a / bprint(divide_numbers(8.0, 2.0))

五、CPU 加速實戰

案例:計算數組的均值

我們先來看一個簡單的計算數組均值的例子,對比使用 Numba 前后的性能差異。

普通 Python 實現
import numpy as npdef mean_python(arr):total = 0for i in range(len(arr)):total += arr[i]return total / len(arr)arr = np.random.rand(1000000)
import time
start = time.time()
result = mean_python(arr)
end = time.time()
print(f"普通 Python 實現耗時: {end - start} 秒")
Numba 加速實現
import numba
import numpy as np@numba.njit
def mean_numba(arr):total = 0for i in range(len(arr)):total += arr[i]return total / len(arr)arr = np.random.rand(1000000)
import time
start = time.time()
result = mean_numba(arr)
end = time.time()
print(f"Numba 加速實現耗時: {end - start} 秒")

通過對比可以發現,使用 Numba 加速后的代碼運行速度明顯更快。

并行計算

Numba 支持在 CPU 上進行并行計算,通過 parallel=Trueprange 來實現。

import numba
import numpy as np@numba.njit(parallel=True)
def parallel_sum(arr):result = 0for i in numba.prange(len(arr)):result += arr[i]return resultarr = np.random.rand(1000000)
import time
start = time.time()
result = parallel_sum(arr)
end = time.time()
print(f"并行計算耗時: {end - start} 秒")

六、GPU 加速實戰

案例:矩陣加法

如果你的計算機配備了 NVIDIA GPU,就可以使用 Numba 進行 GPU 加速。下面是一個矩陣加法的例子。

import numba.cuda
import numpy as np@numba.cuda.jit
def matrix_addition_kernel(A, B, C):x, y = numba.cuda.grid(2)if x < C.shape[0] and y < C.shape[1]:C[x, y] = A[x, y] + B[x, y]def matrix_addition(A, B):C = np.zeros_like(A)d_A = numba.cuda.to_device(A)d_B = numba.cuda.to_device(B)d_C = numba.cuda.to_device(C)threads_per_block = (16, 16)blocks_per_grid_x = (A.shape[0] + threads_per_block[0] - 1) // threads_per_block[0]blocks_per_grid_y = (A.shape[1] + threads_per_block[1] - 1) // threads_per_block[1]blocks_per_grid = (blocks_per_grid_x, blocks_per_grid_y)matrix_addition_kernel[blocks_per_grid, threads_per_block](d_A, d_B, d_C)C = d_C.copy_to_host()return CA = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)
result = matrix_addition(A, B)
print(result)

七、常見問題與注意事項

1. nopython 模式限制

在 nopython 模式下,函數不能使用 Python 的一些動態特性,如動態數據結構(列表、字典)的復雜操作。如果遇到這種情況,需要將代碼進行重構,或者使用 object 模式。

2. 數據傳輸開銷

在使用 GPU 加速時,數據在 CPU 和 GPU 之間的傳輸會產生一定的開銷。因此,盡量減少數據傳輸的次數,將多次小規模的數據傳輸合并為一次大規模的數據傳輸。

3. 性能調優

要根據具體的任務和數據特點,選擇合適的編譯模式、并行策略和線程塊大小,以達到最佳的性能。

八、總結

Numba 為 Python 開發者提供了一種簡單而有效的方式來提升代碼性能。通過本文的學習,你已經從零基礎開始,了解了 Numba 的基本概念、語法和使用方法,并通過實戰案例掌握了 CPU 和 GPU 加速的技巧。在實際應用中,不斷嘗試和優化,你將能夠充分發揮 Numba 的威力,讓你的 Python 代碼運行得更快。

希望這篇博客能夠幫助你快速上手 Numba,并在實際項目中取得良好的效果!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75937.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單位門戶網站被攻擊后的安全防護策略

政府網站安全現狀與挑戰 近年來&#xff0c;隨著數字化進程的加速&#xff0c;政府門戶網站已成為政務公開和服務公眾的重要窗口。然而&#xff0c;網絡安全形勢卻日益嚴峻。國家互聯網應急中心的數據顯示&#xff0c;政府網站已成為黑客攻擊的重點目標&#xff0c;被篡改和被…

Spring Boot 項目三種打印日志的方法詳解。Logger,log,logger 解讀。

目錄 一. 打印日志的常見三種方法&#xff1f; 1.1 手動創建 Logger 對象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用頻率較低&#xff09; 二. 常見的 Logger&#xff0c;logger&#xff0c;…

NI的LABVIEW工具安裝及卸載步驟說明

一.介紹 最近接到個轉交的項目&#xff0c;項目主要作為上位機工具開發&#xff0c;在對接下位機時&#xff0c;有用到NI的labview工具。labview軟件是由美國國家儀器&#xff08;NI&#xff09;公司研制開發的一種程序開發環境&#xff0c;主要用于汽車測試、數據采集、芯片測…

cmd 終端輸出亂碼問題 |Visual Studio 控制臺輸出中文亂碼解決

在網上下載&#xff0c;或者移植別人的代碼到自己的電腦&#xff0c;使用VS運行后&#xff0c;控制臺輸出中文可能出現亂碼。這是因為源代碼的編碼格式和控制臺的編碼格式不一致。 文章目錄 查看源代碼文件編碼格式查看輸出控制臺編碼格式修改編碼格式修改終端代碼頁 補充總結 …

A009-基于pytest的網易云自動化測試

題 目 :基于pytest的網易云自動化測試 主要內容 綜合應用所學的軟件測試理論和方法,實現網易云的功能自動化測試。 (1)自動化測試介紹; (2)自動化功能測試框架介紹; (3)設計功能測試用例 (4)書寫自動化測試腳本; (5)測試評價與結論。 任務要求 (1)能…

LVGL Video控件和Radiobtn控件詳解

LVGL Video控件和Radiobtn控件詳解 一、 Video控件詳解1. 概述2. 創建和初始化3. 基本屬性設置4. 視頻控制5. 回調函數6. 高級功能7. 注意事項 二、Radiobtn控件詳解1. 概述2. 創建和初始化3. 屬性設置4. 狀態控制5. 組管理6. 事件處理7. 樣式設置8. 注意事項 三、效果展示四、…

AbortController:讓異步操作隨時說停就停

AbortController&#xff1a;讓異步操作隨時說停就停 一、什么是 AbortController&#xff1f; AbortController 是 JavaScript 在瀏覽器和部分 Node.js 環境中提供的全局類&#xff0c;用來中止正在進行或待完成的異步操作&#xff08;如 fetch() 請求、事件監聽、可寫流、數…

機器學習 從入門到精通 day_04

1. 決策樹-分類 1.1 概念 1. 決策節點 通過條件判斷而進行分支選擇的節點。如&#xff1a;將某個樣本中的屬性值(特征值)與決策節點上的值進行比較&#xff0c;從而判斷它的流向。 2. 葉子節點 沒有子節點的節點&#xff0c;表示最終的決策結果。 3. 決策樹的…

C++ Primer (第五版)-第十三章 拷貝控制

文章目錄 概述13.1拷貝、賦值與銷毀合成拷貝構造函數拷貝初始化參數和返回值拷貝初始化的限制編譯器可以繞過拷貝構造函數拷貝運算符析構函數三/五原則使用default阻止拷貝合成的拷貝控制成員可能是刪除的 private拷貝控制拷貝控制和資源管理行為像值的類類值拷貝賦值運算符定義…

Vue el-from的el-form-item v-for循環表單如何校驗rules(一)

實際業務需求場景&#xff1a; 新增或編輯頁面&#xff08;基礎信息表單&#xff0c;一個數據列表的表單&#xff09;&#xff0c;數據列表里面的表單數是動態添加的。數據可新增、可刪除&#xff0c;在表單保存前&#xff0c;常常需要做表單必填項的校驗&#xff0c;校驗通過以…

測試100問:http和https的區別是什么?

哈嘍&#xff0c;大家好&#xff0c;我是十二&#xff0c;今天給大家分享的問題是&#xff1a;http和https的區別是什么&#xff1f; 首先我們要知道 HTTP 協議傳播的數據都是未加密的&#xff0c;也就是明文的&#xff0c;因此呢使用 http協議傳輸一些隱私信息也就非常不安全&…

YOLOv3超詳細解讀(三):源碼解析:數據處理模塊

一、概述 YOLOv3&#xff08;You Only Look Once v3&#xff09;是一種高效的目標檢測算法&#xff0c;其數據處理模塊是訓練和推理流程的核心部分。本文將深入分析Ultralytics團隊基于PyTorch實現的YOLOv3源碼中的數據處理模塊&#xff0c;重點探討數據加載、預處理和數據增強…

每日算法(雙指針算法)(Day 1)

雙指針算法 1.算法題目&#xff08;移動零&#xff09;2.講解算法原理3.編寫代碼 1.算法題目&#xff08;移動零&#xff09; 2.講解算法原理 數組劃分&#xff0c;數組分塊&#xff08;快排里面最核心的一步&#xff09;只需把0改為tmp 雙指針算法&#xff1a;利用數組下標來…

2025藍橋杯python A組省賽 題解

真捐款去了&#xff0c;好長時間沒練了&#xff0c;感覺腦子和手都不轉悠了。 B F BF BF 賽時都寫假了&#xff0c; G G G 也只寫了爆搜。 題解其實隊友都寫好了&#xff0c;我就粘一下自己的代碼&#xff0c;稍微提點個人的理解水一篇題解 隊友題解 2025藍橋杯C A組省賽 題…

測試基礎筆記第四天(html)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 html介紹1. 介紹2.骨架標簽3.常用標簽標題標簽段落標簽超鏈接標簽圖片標簽換行和空格標簽布局標簽input標簽&#xff08;變形金剛&#xff09;form標簽列表標簽 htm…

10 穴 汽車連接器的15個設計特點

汽車行業嚴重依賴卓越的電氣系統來確保功能和可靠性。這些系統的關鍵組件是 10 腔連接器&#xff0c;它為布線和信號傳輸提供解決方案。制造商和工程師必須仔細評估這些連接器的設計特性&#xff0c;以優化性能和安全性。 本博客研究了汽車 10 腔連接器的 15 個設計特征&#…

Summary

一、數據結構 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底層是一個HashMap屬性。 // 獲取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…

【Leetcode-Hot100】最小覆蓋子串

題目 解答 想到使用雙指針哈希表來實現&#xff0c;雙指針的left和right控制實現可滿足字符串。 class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t len(s), len(t)hash_map {}for…

Flutter 播放利器:`media_kit` 的詳細介紹與使用指南

在 Flutter 項目中實現音視頻播放&#xff0c;開發者過去主要依賴如 video_player、just_audio 等第三方庫&#xff0c;但這些庫或多或少存在一些局限性&#xff0c;比如平臺兼容性差、定制能力不足、播放格式有限等問題。 而 media_kit 是近年崛起的一款全平臺音視頻播放解決…

4.14【Q】pc homework3

我正在學習并行計算&#xff0c;解決這個問題&#xff1f;詳細解釋&#xff0c;越細節越好 我正在學習并行計算&#xff0c;“首次允許在 taskloop 構造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 構造&#xff09;和 in_reduction&…