numpy學習筆記10:arr *= 2向量化操作性能優化

numpy學習筆記10:arr *= 2向量化操作性能優化

在 NumPy 中,直接對整個數組進行向量化操作(如?arr *= 2)的效率遠高于顯式循環(如?for i in range(len(arr)): arr[i] *= 2)。以下是詳細的解釋:


1. 性能差異的原理

(1) 底層實現不同
  • 顯式循環(錯誤示范)

    • Python 的?for?循環是解釋執行的,每次迭代需要動態解析變量類型、執行函數調用等操作。

    • 對每個元素的操作會觸發多次 Python 層面的類型檢查和計算,產生額外開銷。

  • 向量化操作(正確示范)

    • NumPy 的?arr *= 2?是編譯后的低級代碼(C/Fortran 實現),直接操作連續的內存塊

    • 所有元素的乘法操作一次性完成,無需逐元素處理,且支持 SIMD 指令并行加速。

(2) 內存訪問效率
  • 顯式循環

    • 逐個元素操作會導致頻繁的內存訪問,緩存命中率低。

  • 向量化操作

    • 連續的內存塊一次性加載到 CPU 緩存,充分利用緩存局部性。

(3) 并行化能力
  • 顯式循環

    • Python 的全局解釋器鎖(GIL)限制多線程并行。

  • 向量化操作

    • 底層庫(如 Intel MKL、OpenBLAS)可能使用多線程或 SIMD 指令并行處理多個元素


2. 性能對比實驗

使用?timeit?模塊測試兩種方法的執行時間(以 100 萬個元素的數組為例):

import numpy as np
import timeitarr = np.random.rand(1_000_000)
print("數組的形狀:", arr.shape)
print("數組的前 10 個元素:", arr[:10])# 錯誤示范:顯式循環
def slow_method():global arrfor i in range(len(arr)):arr[i] *= 2# 正確示范:向量化操作
def fast_method():global arrarr *= 2# 測量執行時間
t_slow = timeit.timeit(slow_method, number=100)
t_fast = timeit.timeit(fast_method, number=100)print(f"顯式循環耗時: {t_slow:.4f} 秒")
print(f"向量化操作耗時: {t_fast:.4f} 秒")

輸出結果示例

顯式循環耗時: 5.3127 秒
向量化操作耗時: 0.0052 秒
  • 向量化操作比顯式循環快約 1000 倍


3. 關鍵優勢

(1) 避免 Python 循環開銷
  • Python 的?for?循環每次迭代需要:

    • 檢查循環變量類型。

    • 調用?__getitem__?和?__setitem__?方法。

    • 管理循環計數器。

  • 這些操作在大量迭代時會累積成顯著的時間損耗。

(2) 編譯優化
  • NumPy 的向量化操作通過預編譯的低級代碼直接操作內存,避免 Python 解釋器的動態類型檢查。

  • 例如,arr *= 2?在底層等效于以下 C 代碼:

    for (int i = 0; i < n; i++) {arr[i] *= 2;
    }

    但編譯后的代碼無需每次循環解析類型。

(3) 內存連續性
  • NumPy 數組在內存中是連續存儲的,向量化操作可以一次性加載大塊數據到 CPU 緩存,減少內存訪問延遲。


4. 其他向量化操作示例

所有 NumPy 的數學運算均支持向量化,無需顯式循環:

# 加法
arr += 5# 乘法
arr *= 3# 數學函數
arr = np.sin(arr)# 布爾運算
mask = arr > 0.5

5. 何時使用顯式循環?

  • 無法向量化的復雜邏輯

    # 例如,元素間依賴關系(前一個元素影響后一個)
    for i in range(1, len(arr)):arr[i] = arr[i-1] * 2
  • 需要逐個處理的特殊情況

    for i in range(len(arr)):if arr[i] < 0:arr[i] = 0

總結

  • 優先使用向量化操作:對數組的整體運算(如?arr *= 2)應直接使用 NumPy 的內置函數或運算符。

  • 避免顯式循環:Python 的?for?循環在處理大型數組時效率極低。

  • 性能敏感場景:向量化操作是科學計算的黃金標準,可充分利用硬件加速。

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

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

相關文章

Cursor+Claude-3.5生成Android app

一、Android Studio下載 https://developer.android.com/studio?hlzh-tw#get-android-studio 等待安裝完成 二、新建工程 點擊new project 選擇Empty Activity 起一個工程名 當彈出這個框時 可以在settings里面選擇No proxy 新建好后如下 點擊右邊模擬器&#xff0c…

WPF Reactive 數據綁定

文章目錄 Combox 綁定List-通過枚舉綁定方法一:方法二:Button 綁定TextBlock綁定NumericUpDown綁定Expander綁定checkbox綁定NumericUpDownCombox 綁定List-通過枚舉綁定 方法一: ViewControl using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; usin…

算法及數據結構系列 - 滑動窗口

系列文章目錄 算法及數據結構系列 - 二分查找 算法及數據結構系列 - BFS算法 算法及數據結構系列 - 動態規劃 算法及數據結構系列 - 雙指針 算法及數據結構系列 - 回溯算法 算法及數據結構系列 - 樹 文章目錄 滑動窗口框架思路經典題型76. 最小覆蓋子串567. 字符串的排列438. …

Android adb調試應用程序

啟動app 有的時候app不是預先安裝的&#xff0c;也不能從界面start一個app&#xff0c;這時需要后臺拉起app。 $adb shell am start package.name/Activity.name 例如&#xff0c;android原生camera app&#xff0c; 包名為com.android.camera2&#xff0c; mainActivity名為…

Java EE(15)——網絡原理——TCP協議解析一

一.確認應答/(確認)序列號 接收方接收到數據后&#xff0c;向發送方返回一個確認信號(ack)&#xff0c;告訴發送方數據被成功接收。ACK報文段只是作為確認使用的&#xff0c;一般來說不攜帶應用層數據&#xff08;載荷&#xff09;&#xff0c;也就是說只有報頭部分。但有可能…

node-ddk,electron 組件, 打開新窗口

node-ddk 打開新窗口 https://blog.csdn.net/eli960/article/details/146207062 也可以下載demo直接演示 http://linuxmail.cn/go#node-ddk 本文講解如何在渲染進程發起創建新窗口, 包括 window.open 在主進程定義窗口類型 import main, { NODEDDK } from "node-ddk…

git管理時keil項目忽略文件列表

在使用 Git 管理 Keil MDK&#xff08;μVision 5&#xff09;工程時&#xff0c;需要忽略編譯生成的臨時文件、調試文件、用戶配置等非必要內容。以下是忽略文件的詳細列表及說明&#xff0c;可直接保存為 .gitignore 文件&#xff1a; Keil MDK 工程的 .gitignore 文件 giti…

C#單例模式

單例模式 (Singleton),保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點。通常我們可以讓一個全局變量使得一個對象被訪問&#xff0c;但它不能防止你實例化對個對象&#xff0c;一個最好的辦法就是&#xff0c;讓類自身負責保護它的唯一實例。這個類可以保證沒…

ZYNQ的cache原理與一致性操作

在Xilinx Zynq SoC中&#xff0c;Cache管理是確保處理器與外部設備&#xff08;如FPGA邏輯、DMA控制器&#xff09;之間數據一致性的關鍵。Zynq的ARM Cortex-A9處理器包含L1 Cache&#xff08;指令/數據&#xff09;和L2 Cache&#xff0c;其刷新&#xff08;Flush/Invalidate&…

Linux NFS、自動掛載與系統啟動管理指南

1. NFS客戶端掛載導出的目錄的方式 NFS&#xff08;網絡文件系統&#xff09; 允許將遠程服務器的目錄掛載到本地&#xff0c;像訪問本地文件一樣操作遠程文件。掛載方式主要有兩種&#xff1a; 手動掛載&#xff1a;使用 mount 命令&#xff08;臨時生效&#xff0c;重啟后丟…

NO.55十六屆藍橋杯備戰|排序|插入|選擇|冒泡|堆|快速|歸并(C++)

插?排序 插?排序(Insertion Sort)類似于玩撲克牌插牌過程&#xff0c;每次將?個待排序的元素按照其關鍵字??插?到前?已排好序的序列中&#xff0c;按照該種?式將所有元素全部插?完成即可 #include <iostream> using namespace std; const int N 1e5 10; …

【Oracle資源損壞類故障】:詳細了解壞塊

目錄 1、物理壞塊與邏輯壞塊 1.1、物理壞塊 1.2、邏輯壞塊 2、兩個壞塊相關的參數 2.1、db_block_checksum 2.2、db_block_checking 3、檢測壞塊 3.1、告警日志 3.2、RMAN 3.3、ANALYZE 3.4、數據字典 3.5、DBVERIFY 4、修復壞塊 4.1、RMAN修復 4.2、DBMS_REPA…

計算機網絡高頻(二)TCP/IP基礎

計算機網絡高頻(二)TCP/IP基礎 1.什么是TCP/IP?? TCP/IP是一種網絡通信協議,它是互聯網中最常用的協議之一。TCP/IP有兩個基本的協議:TCP(傳輸控制協議)和IP(互聯網協議)。 TCP(Transmission Control Protocol,傳輸控制協議)是一種可靠的、面向連接的協議。它負…

【大模型算法工程】大模型應用工具化、忠誠度以及知識庫場景下PDF雙欄解析問題的討論

1. 大模型時代應用工具化以及無忠誠度現象討論 接觸大模型久了&#xff0c;也慢慢探到一些大模型能力表現非常自然和突出的場景&#xff0c;比如AI搜索&#xff08;依賴大模型的理解總結能力&#xff09;、AI對話&#xff08;即chat&#xff0c;依賴大模型的生成能力&#xff0…

Java EE(13)——網絡編程——UDP/TCP回顯服務器

前言 本文主要介紹UDP和TCP相關的API&#xff0c;并且基于這兩套API實現回顯服務器 UDP和TCP UDP和TCP屬于網絡五層模型中傳輸層的協議 特點&#xff1a; UDP&#xff1a;無連接&#xff0c;不可靠&#xff0c;面向數據包&#xff0c;全雙工 TCP&#xff1a;有連接&#xff…

【藍橋杯】12111暖氣冰場(多源BFS 或者 二分)

思路 這題可以用BFS做&#xff0c;也可以用二分來做。 用二分這里只提供一個思路&#xff1a;對時間來二分查找&#xff0c;check函數就是檢查在特定的時間 t 0 t_0 t0?內每一個暖氣爐的傳播距離能否覆蓋所有格子。 用BFS做&#xff1a; 由幾個點開始向外擴散&#xff0c;知道…

使用bat批量獲取WORD中包含對應字符的段落,段落使用回車換行

get_word_paragraphs.vbs 獲取命令行參數 If WScript.Arguments.Count 0 ThenWScript.Quit 1 End If 獲取 Word 文檔路徑 docPath WScript.Arguments(0) 創建 Word 應用程序對象 Set objWord CreateObject("Word.Application") objWord.Visible False 打開 Word …

DeepSeek自學手冊:《從理論(模型訓練)到實踐(模型應用)》|73頁|附PPT下載方法

導 讀INTRODUCTION 今天分享是由ai呀蔡蔡團隊帶來的DeepSeek自學手冊&#xff1a;《從理論&#xff08;模型訓練&#xff09;到實踐&#xff08;模型應用&#xff09;》&#xff0c;這是一篇關于DeepSeek模型訓練、應用場景及替代方案的綜合指南文章&#xff0c;主要介紹了Deep…

WEB API 設計規范

REST API 簡介 REST 是 Representational State Transfer 的縮寫&#xff0c;它將資源作為核心概念&#xff0c;通過 HTTP 方法對資源進行操作。其本身是一套圍繞資源進行操作的架構規范。在實際應用中&#xff0c;更多的是體現在 API 的設計上。 企業在進行產品設計開發時&a…

QT軟件匠心開發,塑造卓越設計服務

在當今這個數字化飛速發展的時代&#xff0c;軟件已經成為我們生活中不可或缺的一部分。而QT&#xff0c;作為一款跨平臺的C圖形用戶界面應用程序開發框架&#xff0c;憑借其強大的功能和靈活性&#xff0c;在眾多軟件開發工具中脫穎而出。我們深知&#xff0c;在軟件開發領域&…