Numba是什麼?Numba如何使用?

老男孩IT教育機構發表於2020-12-22

  Numba,一款可以讓Python函式編譯為機器程式碼的JIT編譯器,它可以加速Python執行,想必很多人對它都十分感興趣,接下來我們就來看看吧。

  Numba是什麼?

  Numba是一個庫,可以在執行時將Python程式碼編譯為本地機器指令,而不會強制大幅度的改變普通的Python程式碼(稍後再做說明)。翻譯/魔術是使用LLVM編譯器完成的,該編譯器是相當活躍的開源社群開發的。

  Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但現在它是開源的。核心應用領域是math-heavy(密集數學?重型數學?)和array-oriented(面向陣列)的功能,它們在本地Python中相當緩慢。想象一下,在Python中編寫一個模組,必須一個元素接著一個元素的迴圈遍歷一個非常大的陣列來執行一些計算,而不能使用向量操作來重寫。這是很不好的主意,是吧?所以“通常”這類庫函式是用C / C ++或Fortran編寫的,編譯後,在Python中作為外部庫使用。Numba這類函式也可以寫在普通的Python模組中,而且執行速度的差別正在逐漸縮小。

  如何使用Numba呢?

  使用它的要求不多。基本上,你寫一個自己的“普通”的Python函式,然後給函式定義新增一個裝飾(如果你不是很熟悉裝飾器,讀一下關於this或that)。你可以使用不同型別的裝飾器,但@jit可能是剛開始的選擇之一。其他裝飾器可用於例如建立numpy通用功能@vectorize或編寫將在CUDA GPU上執行的程式碼@cuda。在本文中暫時不介紹這些裝飾。現在,讓我們來看看基本的步驟。他們提供的程式碼示例是2d陣列的求和函式,以下是程式碼:

  from numba import jit

  from numpy import arange

  # jit decorator tells Numba to compile this function.# The argument types will be inferred by Numba when function is called.

  @jit

  def sum2d(arr):

  M, N = arr.shape

  result = 0.0

  for i in range(M):

  for j in range(N):

  result += arr[i,j]

  return result

  a = arange(9).reshape(3,3)

  print(sum2d(a))

  正如你所看到的,Numba裝飾器被新增到函式定義中,並且voilá這個函式將執行得很快。但是,這裡帶來了很有趣的注意事項:你只能使用Numpy和標準庫裡的函式來加快Numba速度,甚至不需要開了他們所有的特性。他們有一個相當好的文件(參考資料),列出了所有支援的內容。見here是所支援Python的功能和here 是所支援的Numpy功能。現在支援的功能可能還不太多,但我想告訴你,這就夠了!請記住,Numba不是要加快你的資料庫查詢或如何強化影像處理功能。他們的目標是加快面向陣列的計算,我們可以使用它們庫中提供的函式來解決。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2744436/,如需轉載,請註明出處,否則將追究法律責任。

相關文章