Cython中神奇的libc.math.abs

Ant*_*ins 12 python math cython

如何用Cython设法cimport abslibc.math

from libc.math cimport abs
Run Code Online (Sandbox Code Playgroud)

如果它不存在?

> grep abs Cython/Includes/libc/math.pxd
<nothing>
Run Code Online (Sandbox Code Playgroud)

我甚至尝试删除该文件中的所有内容(我得到了0长度math.pxd)但它却在某种程度上设法找到abs那里.

更新

这是关于cython的第三个问题:

在我发现第一个问题libcpp.complex没有写得非常正确的情况下,@ axil在cython github repo中提出了一张票,然后用我的修复程序发出拉取请求,取代了大约20%的complex.pyd行.因此,cython用户不时查看包含目录是有意义的.

第二个问题解决了abs据称是由它并没有转化为所有的Python代码到c用Cython作者忽视,调用原来蟒蛇ABS功能内置.解决方案涉及修补cython/compiler/Builtin.py文件.

现在我的第三个问题是关于abs函数,现在从'libc.math'导入.它确实有效,但它们的工作方式对我来说真的很棒.在我看来,在没有从没有它的模块中导入函数的情况下,Cython中有足够的魔力.

更新2:

事实证明,这是abs()从那里导入的lib.math.实际上,这个导入只是被忽略了:

 1: from libc.math cimport abs                   # nothing changes when I comment it out
 2: 
+3: def f():                                     # yellow
+4:     cdef double complex aaa = 1 + 2j         # white 
+5:     cdef double bbb = abs(aaa)               # yellow
Run Code Online (Sandbox Code Playgroud)

__pyx_t_1 = __pyx_PyComplex_FromComplex(__ pyx_v_aaa); if(不太可能(!__ pyx_t_1))__PYX_ERR(
0,5,__ pyx_L1_error)__Pyx_GOTREF(__ pyx_t_1);
__pyx_t_2 = PyNumber_Absolute(__ pyx_t_1); if(不太可能(!__ pyx_t_2))__PYX_ERR(
0,5,__ pyx_L1_error)__Pyx_GOTREF(__ pyx_t_2);
__Pyx_DECREF(__ pyx_t_1); __pyx_t_1 = 0;
__pyx_t_3 = __pyx_PyFloat_AsDouble(__ pyx_t_2); if(不太可能((__ pyx_t_3 ==(double)-1)&& PyErr_Occurred()))
__PYX_ERR(0,5,__ pyx_L1_error)__Pyx_DECREF(__ pyx_t_2); __pyx_t_2 = 0; __pyx_v_bbb = __pyx_t_3;

应该注意的是,@ DavidW的前一个问题的补丁在最后一行变为白色(被编译为c)的意义上修复了它.但我不明白为什么忽略了导入abs的原因.

更新3

另一个观察是abs()libcpp.complex预期的工作中进口:

# distutils: language = c++
from libcpp.complex cimport complex, abs

ctypedef complex[double] dcomplex

def f():
    cdef dcomplex aaa = dcomplex(1, 2)
    cdef double bbb = abs[double](aaa)
    return bbb
Run Code Online (Sandbox Code Playgroud)

所以对于cython来说,嵌入内置产品并不是什么大问题.

小智 1

Cython pxd 文件位于 {Python_path}/.../site_packages/Cython/Includes 因此,如果查看 libc/stdlib.pxd 那么您将看到 stdlib.pxd 有 abs() 和 libcpp/complex.pxd 有一个模板函数 abs用于复数模板类。在 libc/math.pxd 中,您可以找到浮点类型的 fabs() 。