2016-09-02 38 views
1

作爲標題建議,我想高效地對函數進行集成,其核心是簡單地在下面完成這個工作(完整的函數是太長的方式發佈,但大部分時間就是在這裏度過):如何高效地對「矢量化」函數進行集羣化(numpy庫) - python

def func(*vargs): 
     for _n, _i in enumerate(inds): 
      the_args[_i] = vargs[_n] 
     kwargs.update(zip(names, vargs[len(inds):])) 
     return self.pyfunc(*the_args, **kwargs) 

我已閱讀這些指南(http://cython.readthedocs.io/en/latest/src/tutorial/numpy.htmlhttp://pandas.pydata.org/pandas-docs/stable/enhancingperf.html),這是非常有用的,但我的C的知識是太狹窄,他們使用他們的潛力的一小部分。

你會怎麼做呢? [Python 3.5.1,Cython 0.25a,Numpy 1.10.4]

+0

我懷疑你是否可以。您正在迭代具有未知維數的數組,並調用返回未知類型的python函數。代碼中必須非常靈活,因此Cython不太可能提供幫助。 – DavidW

+0

你是否堅持使用'pyfunc',一個黑箱python函數,cython不能轉換爲'c'? – hpaulj

+0

我正在嘗試的東西正在減慢或不工作。我想過如在np.ndarray [DTYPE_t,ndim = 2], cdef np.ndarray [DTYPE_t,ndim = 2] h = ...中的其中一個參數中定義ndarray類型,但它似乎不工作 – Asher11

回答

2

你顯示的功能只是一個跳舞處理kwargs。請注意0​​該塊的頭部註釋。用更簡單的參數,它只設置func = self.pyfunc

實際工作是在最後一行完成:

self._vectorize_call(func=func, args=vargs) 

這確實

outputs = ufunc(*inputs) 
< return dtype conversion > 

ufunc是,在大多數情況下,frompyfunc(func, len(args), nout)

因此剝離這一切的Python蓋的,把它歸結爲

np.frompyfunc(your_func, n, m)(args) 

frompyfunc是編譯功能。我懷疑該函數使用nditerc版本)來廣播參數,並將值作爲標量提供給your_func。我在另一個最近的SO中討論了使用nditercython

總之,只要your_func是一個不可琢磨的(或一般的)python函數,沒有什麼cython可以做什麼來改善這一點。迭代已經在編譯代碼中處理了。