91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

      手機站
      千鋒教育

      千鋒學習站 | 隨時隨地免費學

      千鋒教育

      掃一掃進入千鋒手機站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學習站小程序
      隨時隨地免費學習課程

      當前位置:首頁  >  技術(shù)干貨  > 用Numba加速Python代碼,變得像C++一樣快

      用Numba加速Python代碼,變得像C++一樣快

      來源:千鋒教育
      發(fā)布人:wjy
      時間: 2022-11-16 14:07:42 1668578862

        1.介紹

        Numba 是 python 的即時(Just-in-time)編譯器,即當你調(diào)用 python 函數(shù)時,你的全部或部分代碼就會被轉(zhuǎn)換為“即時”執(zhí)行的機器碼,它將以你的本地機器碼速度運行!它由 Anaconda 公司贊助,并得到了許多其他組織的支持。

        在 Numba 的幫助下,你可以加速所有計算負載比較大的 python 函數(shù)(例如循環(huán))。它還支持 numpy 庫!所以,你也可以在你的計算中使用 numpy,并加快整體計算,因為 python 中的循環(huán)非常慢。你還可以使用 python 標準庫中的 math 庫的許多函數(shù),如 sqrt 等。有關(guān)所有兼容函數(shù)的完整列表,請查看 此處。

        2.為什么選擇 Numba?

        那么,當有像 cython 和 Pypy 之類的許多其他編譯器時,為什么要選擇 numba?

        原因很簡單,這樣你就不必離開寫 python 代碼的舒適區(qū)。是的,就是這樣,你根本不需要為了獲得一些的加速來改變你的代碼,這與你從類似的具有類型定義的 cython 代碼獲得的加速相當。那不是很好嗎?

        你只需要添加一個熟悉的 python 功能,即添加一個包裝器(一個裝飾器)到你的函數(shù)上。類的裝飾器也在開發(fā)中了。

        所以,你只需要添加一個裝飾器就可以了。例如:

      用Numba加速Python代碼1

        這仍然看起來像一個原生 python 代碼,不是嗎?

        3.如何使用 Numba?

        Numba 使用 LLVM 編譯器基礎(chǔ)結(jié)構(gòu) 將原生 python 代碼轉(zhuǎn)換成優(yōu)化的機器碼。使用 numba 運行代碼的速度可與 C/C++ 或 Fortran 中的類似代碼相媲美。

        以下是代碼的編譯方式:

      用Numba加速Python代碼2

        首先,Python 函數(shù)被傳入,優(yōu)化并轉(zhuǎn)換為 numba 的中間表達,然后在類型推斷(type inference)之后,就像 numpy 的類型推斷(所以 python float 是一個 float64),它被轉(zhuǎn)換為 LLVM 可解釋代碼。然后將此代碼提供給 LLVM 的即時編譯器以生成機器碼。

        你可以根據(jù)需要在運行時或?qū)霑r 生成 機器碼,導入需要在 CPU(默認)或 GPU 上進行。

        4.使用 numba 的基本功能

        (只需要加上 @jit !)

        為了獲得最佳性能,numba 實際上建議在你的 jit 裝飾器中加上 nopython=True 參數(shù),加上后就不會使用 Python 解釋器了。或者你也可以使用 @njit。如果你加上 nopython=True的裝飾器失敗并報錯,你可以用簡單的 @jit 裝飾器來編譯你的部分代碼,對于它能夠編譯的代碼,將它們轉(zhuǎn)換為函數(shù),并編譯成機器碼。然后將其余部分代碼提供給 python 解釋器。

        所以,你只需要這樣做:

      用Numba加速Python代碼3

        當使用 @jit 時,請確保你的代碼有 numba 可以編譯的內(nèi)容,比如包含庫(numpy)和它支持的函數(shù)的計算密集型循環(huán)。否則它將不會編譯任何東西,并且你的代碼將比沒有使用 numba 時更慢,因為存在 numba 內(nèi)部代碼檢查的額外開銷。

        還有更好的一點是,numba 會對首次作為機器碼使用后的函數(shù)進行緩存。因此,在第一次使用之后它將更快,因為它不需要再次編譯這些代碼,如果你使用的是和之前相同的參數(shù)類型。

        如果你的代碼是 可并行化 的,你也可以傳遞 parallel=True 作為參數(shù),但它必須與 nopython=True 一起使用,目前這只適用于CPU。

        你還可以指定希望函數(shù)具有的函數(shù)簽名,但是這樣就不會對你提供的任何其他類型的參數(shù)進行編譯。例如:

      用Numba加速Python代碼4

        現(xiàn)在你的函數(shù)只能接收兩個 int32 類型的參數(shù)并返回一個 int32 類型的值。通過這種方式,你可以更好地控制你的函數(shù)。如果需要,你甚至可以傳遞多個函數(shù)簽名。

      用Numba加速Python代碼5

        你還可以使用 numba 提供的其他裝飾器:

        @vectorize:允許將標量參數(shù)作為 numpy 的 ufuncs 使用,

        @guvectorize:生成 NumPy 廣義上的 ufuncs,

        @stencil:定義一個函數(shù)使其成為 stencil 類型操作的核函數(shù)

        @jitclass:用于 jit 類,

        @cfunc:聲明一個函數(shù)用于本地回調(diào)(被C/C++等調(diào)用),

        @overload:注冊你自己的函數(shù)實現(xiàn),以便在 nopython 模式下使用,例如:@overload(scipy.special.j0)。

        Numba 還有 Ahead of time(AOT)編譯,它生成不依賴于 Numba 的已編譯擴展模塊。但:

        它只允許常規(guī)函數(shù)(ufuncs 就不行),

        你必須指定函數(shù)簽名。并且你只能指定一種簽名,如果需要指定多個簽名,需要使用不同的名字。

        它還根據(jù)你的CPU架構(gòu)系列生成通用代碼。

        5.@vectorize 裝飾器

        通過使用 @vectorize 裝飾器,你可以對僅能對標量操作的函數(shù)進行轉(zhuǎn)換,例如,如果你使用的是僅適用于標量的 python 的 math 庫,則轉(zhuǎn)換后就可以用于數(shù)組。這提供了類似于 numpy 數(shù)組運算(ufuncs)的速度。例如:

      用Numba加速Python代碼6

        你還可以將 target 參數(shù)傳遞給此裝飾器,該裝飾器使 target 參數(shù)為 parallel 時用于并行化代碼,為 cuda 時用于在 cudaGPU 上運行代碼。

      用Numba加速Python代碼7

        使 target=“parallel” 或 “cuda” 進行矢量化通常比 numpy 實現(xiàn)的代碼運行得更快,只要你的代碼具有足夠的計算密度或者數(shù)組足夠大。如果不是,那么由于創(chuàng)建線程以及將元素分配到不同線程需要額外的開銷,因此可能耗時更長。所以運算量應(yīng)該足夠大,才能獲得明顯的加速。

      用Numba加速Python代碼8

        這個視頻講述了一個用 Numba 加速用于計算流體動力學的Navier Stokes方程的例子:

        6.在GPU上運行函數(shù)

        你也可以像裝飾器一樣傳遞 @jit 來運行 cuda/GPU 上的函數(shù)。為此你必須從 numba 庫中導入 cuda。但是要在 GPU 上運行代碼并不像之前那么容易。為了在 GPU 上的數(shù)百甚至數(shù)千個線程上運行函數(shù),需要先做一些初始計算。實際上,你必須聲明并管理網(wǎng)格,塊和線程的層次結(jié)構(gòu)。這并不那么難。

        要在GPU上執(zhí)行函數(shù),你必須定義一個叫做 核函數(shù) 或 設(shè)備函數(shù) 的函數(shù)。首先讓我們來看 核函數(shù)。

        關(guān)于核函數(shù)要記住一些要點:

        核函數(shù)在被調(diào)用時要顯式聲明其線程層次結(jié)構(gòu),即塊的數(shù)量和每塊的線程數(shù)量。你可以編譯一次核函數(shù),然后用不同的塊和網(wǎng)格大小多次調(diào)用它。

        核函數(shù)沒有返回值。因此,要么必須對原始數(shù)組進行更改,要么傳遞另一個數(shù)組來存儲結(jié)果。為了計算標量,你必須傳遞單元素數(shù)組。

      用Numba加速Python代碼9

        因此,要啟動核函數(shù),你必須傳入兩個參數(shù):

        每塊的線程數(shù),

        塊的數(shù)量。

        例如:

      用Numba加速Python代碼10

        每個線程中的核函數(shù)必須知道它在哪個線程中,以便了解它負責數(shù)組的哪些元素。Numba 只需調(diào)用一次即可輕松獲得這些元素的位置。

      用Numba加速Python代碼11

        為了節(jié)省將 numpy 數(shù)組復制到指定設(shè)備,然后又將結(jié)果存儲到 numpy 數(shù)組中所浪費的時間,Numba 提供了一些 函數(shù) 來聲明并將數(shù)組送到指定設(shè)備,如:numba.cuda.device_array,numba.cuda。device_array_like,numba.cuda.to_device 等函數(shù)來節(jié)省不必要的復制到 cpu 的時間(除非必要)。

        另一方面,設(shè)備函數(shù) 只能從設(shè)備內(nèi)部(通過核函數(shù)或其他設(shè)備函數(shù))調(diào)用。比較好的一點是,你可以從 設(shè)備函數(shù) 中返

      用Numba加速Python代碼12

        你還應(yīng)該在這里查看 Numba 的 cuda 庫支持的功能。

        Numba 在其 cuda 庫中也有自己的原子操作,隨機數(shù)生成器,共享內(nèi)存實現(xiàn)(以加快數(shù)據(jù)的訪問)等功能。

        ctypes/cffi/cython 的互用性:

        cffi – 在 nopython 模式下支持調(diào)用 CFFI 函數(shù)。

        ctypes – 在 nopython 模式下支持調(diào)用 ctypes 包裝函數(shù)。

        Cython 導出的函數(shù)是 可調(diào)用的。

      tags:
      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
      請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
      免費領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學 138****2860 剛剛成功領(lǐng)取
      王同學 131****2015 剛剛成功領(lǐng)取
      張同學 133****4652 剛剛成功領(lǐng)取
      李同學 135****8607 剛剛成功領(lǐng)取
      楊同學 132****5667 剛剛成功領(lǐng)取
      岳同學 134****6652 剛剛成功領(lǐng)取
      梁同學 157****2950 剛剛成功領(lǐng)取
      劉同學 189****1015 剛剛成功領(lǐng)取
      張同學 155****4678 剛剛成功領(lǐng)取
      鄒同學 139****2907 剛剛成功領(lǐng)取
      董同學 138****2867 剛剛成功領(lǐng)取
      周同學 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT
      為什么SpringBoot的 jar 可以直接運行?

      一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項目的類文件、資源文件以及依賴庫等...詳情>>

      2023-10-14 23:01:49
      站群服務(wù)器是什么?

      站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個人擁有,并且經(jīng)常會互相鏈...詳情>>

      2023-10-14 22:46:12
      自編碼器是什么?

      一、自編碼器原理自編碼器的設(shè)計靈感源于神經(jīng)科學中關(guān)于感知系統(tǒng)的認知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個隱藏層的特征表示...詳情>>

      2023-10-14 22:41:10
      什么是云網(wǎng)融合?

      一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計算與網(wǎng)絡(luò)技術(shù)相結(jié)合,實現(xiàn)資源的共享、業(yè)務(wù)的協(xié)同,將網(wǎng)絡(luò)與云端服務(wù)深度融合,提供更靈活、高效、安全的...詳情>>

      2023-10-14 22:31:47
      什么是setnx、Redlock、Redisson?

      一、setnxsetnx是Redis中的一個命令,用于將鍵值對(key-value)設(shè)置到Redis數(shù)據(jù)庫中。其中,setnx表示”Set if Not Exists”,即當...詳情>>

      2023-10-14 22:22:53