2015年11月16日

using numpy in cython

最近大量的使用cython+numpy的方式在寫程式,有許多小細節值得注意。
在官方的文檔中,http://docs.cython.org/src/tutorial/numpy.html
基本使用方法如下:

cimport numpy as cnp
ctypedef cnp.float64_t FLOAT_t

@cython.wraparound(False)
@cython.boundscheck(False)
def myfunc(cnp.ndarray[FLOAT_t, ndim=2] f):
pass

  • numpy所定義的c version data type都是python version後面加_t,支援的type如連結
  • wraparound(False)關閉負值索引
  • boundcheck(False)加速array元素的存取,但是會無法使用負值的index且不做bound check。
  • 其它可用的選項可查詢:compiler directives
    cnp.ndarray[FLOAT_t, ndim=2]將不使用python的慢速索引,而直接使用c的buffer。
  • 如果在function中,array沒有使用到numpy的broadcasting或是相關的函式,而只有單純的存取元素時,可使用memoryview的方式定義變數。