2016-09-02 37 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可以做什么来改善这一点。迭代已经在编译代码中处理了。