'Python中循環操作和Numpy數組運算性能優化——Numba使用介紹'

"
"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

不使用@jit,執行上述代碼,發現它平均需要耗時23秒的時間。

接下來我們使用@jit,來看一下Numba的效率究竟多麼強大。

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

不使用@jit,執行上述代碼,發現它平均需要耗時23秒的時間。

接下來我們使用@jit,來看一下Numba的效率究竟多麼強大。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

使用了@jit只用了0.2秒,與不使用@jit相比,這已不是同一個數量級了,快了100餘倍。Numba可以把各種具有很大循環的函數加到很快的速度,相比與Numpy的加速只適用於Numpy自帶的函數。但要注意的是,Numba對沒有循環或者只有非常小循環的函數加速效果並不明顯,用不用都一樣。


使用 vectorize 實現 類似於Numpy 的 Ufunc 功能

在Numpy中有一個非常強大的功能——Ufunc (universal functions),它可以讓一個函數同時處理很多數據。比如計算一個數組中每一個元素的三角函數,只需要使用numpy.sin(n)即可,而不是要寫個循環遍歷計算。

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

不使用@jit,執行上述代碼,發現它平均需要耗時23秒的時間。

接下來我們使用@jit,來看一下Numba的效率究竟多麼強大。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

使用了@jit只用了0.2秒,與不使用@jit相比,這已不是同一個數量級了,快了100餘倍。Numba可以把各種具有很大循環的函數加到很快的速度,相比與Numpy的加速只適用於Numpy自帶的函數。但要注意的是,Numba對沒有循環或者只有非常小循環的函數加速效果並不明顯,用不用都一樣。


使用 vectorize 實現 類似於Numpy 的 Ufunc 功能

在Numpy中有一個非常強大的功能——Ufunc (universal functions),它可以讓一個函數同時處理很多數據。比如計算一個數組中每一個元素的三角函數,只需要使用numpy.sin(n)即可,而不是要寫個循環遍歷計算。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

若不用Numpy如何實現高效的計算呢?我們可以使用math.sin,然後寫個循環再用numba加速。

除此之外,Numba也有另一個更強大的功能——矢量化(vectorize)。像上面的jit一樣,只要添加一行vectorize修飾器,就可以讓普通函數變成Ufunc,如下:

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

不使用@jit,執行上述代碼,發現它平均需要耗時23秒的時間。

接下來我們使用@jit,來看一下Numba的效率究竟多麼強大。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

使用了@jit只用了0.2秒,與不使用@jit相比,這已不是同一個數量級了,快了100餘倍。Numba可以把各種具有很大循環的函數加到很快的速度,相比與Numpy的加速只適用於Numpy自帶的函數。但要注意的是,Numba對沒有循環或者只有非常小循環的函數加速效果並不明顯,用不用都一樣。


使用 vectorize 實現 類似於Numpy 的 Ufunc 功能

在Numpy中有一個非常強大的功能——Ufunc (universal functions),它可以讓一個函數同時處理很多數據。比如計算一個數組中每一個元素的三角函數,只需要使用numpy.sin(n)即可,而不是要寫個循環遍歷計算。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

若不用Numpy如何實現高效的計算呢?我們可以使用math.sin,然後寫個循環再用numba加速。

除此之外,Numba也有另一個更強大的功能——矢量化(vectorize)。像上面的jit一樣,只要添加一行vectorize修飾器,就可以讓普通函數變成Ufunc,如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

可以看出,用Numba.vectorize 改寫的三角函數具有了和np.sin()相同的功能,而且性能表現也不比Numpy差。當遇到Numpy沒有的數學函數時,用Numba矢量化不失為一個好的選擇。除了math中的sin,它支持的其他函數列表可以在 Numba官網的 documentation中查看。


想要了解更多Numba使用 可以,進一步閱讀GitHub :

https://github.com/numba/numba

"
Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

直到遇到Numba,才知道“一行代碼讓Python的運行速度提高100倍” 的論調 ,並不是譁眾取寵。


Numba

Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。

Numba是Python的即時編譯器,它最適用於使用NumPy數組和函數以及循環的代碼,能夠大幅提高直接使用Python編寫的函數的運算速度。

Numba使用行業標準的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C、C++或Fortran的速度,且無需改變Python的解釋器。只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。


專為科學計算而生

Python 本身由於其動態語言的本質,並不適合於計算量很大的科學計算。然而 Numpy 提供的帶類型的數據結構,以及預編譯好的基於 C 或 Fortran 的高速計算庫,補足了Python計算性能短板,而Numba無疑直接給Python計算性能裝了一個發動機。

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和佈局生成專門的代碼,特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。同時鑑於可以支持異構計算,加速效果可能比裸C寫得還好。這對於那些用Python做高密度的計算或者人工智能的場景而言非常有效。

Numba還可以與Jupyter配合使用,實現交互式計算,以及分佈式執行框架,如Dask、Spark。

Numba的主要特性:

  • 動態代碼生成
  • 為CPU和GPU硬件生成原生的代碼
  • 集成Python的科學計算庫Numpy

支持環境

開箱即用的Numba支持以下環境:

  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux

大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


安裝 Numba

在 Windows10,Python3環境中使用pip 進行安裝:

 pip install numba 

安裝過程如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹


使用 jit 加速 Python 低效的 for 語句

jit 的全稱是 Just-in-time,在 Numba裡面則特指 Just-in-time compilation(即時編譯),使用Numba來加速代碼的運行,簡潔易用,Numba 對源代碼的修改很小,幾乎是只需要加一個 @jit 修飾器就可以了。相對於Cython,使用Numba也是在性能和可讀性之間的平衡。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

不使用@jit,執行上述代碼,發現它平均需要耗時23秒的時間。

接下來我們使用@jit,來看一下Numba的效率究竟多麼強大。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

使用了@jit只用了0.2秒,與不使用@jit相比,這已不是同一個數量級了,快了100餘倍。Numba可以把各種具有很大循環的函數加到很快的速度,相比與Numpy的加速只適用於Numpy自帶的函數。但要注意的是,Numba對沒有循環或者只有非常小循環的函數加速效果並不明顯,用不用都一樣。


使用 vectorize 實現 類似於Numpy 的 Ufunc 功能

在Numpy中有一個非常強大的功能——Ufunc (universal functions),它可以讓一個函數同時處理很多數據。比如計算一個數組中每一個元素的三角函數,只需要使用numpy.sin(n)即可,而不是要寫個循環遍歷計算。

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

若不用Numpy如何實現高效的計算呢?我們可以使用math.sin,然後寫個循環再用numba加速。

除此之外,Numba也有另一個更強大的功能——矢量化(vectorize)。像上面的jit一樣,只要添加一行vectorize修飾器,就可以讓普通函數變成Ufunc,如下:

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

可以看出,用Numba.vectorize 改寫的三角函數具有了和np.sin()相同的功能,而且性能表現也不比Numpy差。當遇到Numpy沒有的數學函數時,用Numba矢量化不失為一個好的選擇。除了math中的sin,它支持的其他函數列表可以在 Numba官網的 documentation中查看。


想要了解更多Numba使用 可以,進一步閱讀GitHub :

https://github.com/numba/numba

Python中循環操作和Numpy數組運算性能優化——Numba使用介紹

"

相關推薦

推薦中...