【问题标题】:how to efficiently cythonize the "vectorize" function (numpy library) - python如何有效地对“vectorize”函数(numpy库)进行cythonize - python
【发布时间】:2016-09-03 00:36:44
【问题描述】:

正如标题建议的那样,我想有效地对numpy.vectorize 函数进行cythonize,它的核心是简单化下面的这篇文章(完整的函数太长了,无法发布,但大部分时间都花在了这里):

    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]

【问题讨论】:

  • 我怀疑你是否可以。您正在迭代具有未知维数的数组并调用返回未知类型的 python 函数。您必须在代码中非常灵活,因此 Cython 不太可能提供帮助。
  • 你还在坚持pyfunc,这是一个cython无法转换为c的黑盒python函数吗?
  • 我正在尝试的东西正在减慢或无法正常工作。我想过像在指南之一np.ndarray[DTYPE_t, ndim=2] , cdef np.ndarray[DTYPE_t, ndim=2] h = ... 中那样定义 ndarray 类型,但它似乎不起作用

标签: python numpy vectorization cython


【解决方案1】:

您展示的功能只是处理kwargs的一点点舞蹈。请注意 vectorize.__call__ 中该块头部的注释。使用更简单的参数,它只设置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 就无法对此进行改进。已在编译代码中处理迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多