Cython中神奇的libc.math.abs

时间:2017-03-29 04:56:03

标签: python math cython

cython如何从cimport abs

管理libc.math
from libc.math cimport abs

如果不存在?

> grep abs Cython/Includes/libc/math.pxd
<nothing>

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

更新

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

first question我发现libcpp.complex编写得不是很正确,@ axil在cython github repo中提出了一张票,然后用我的修复程序提出拉取请求,取代了大约20%的复数。 pyd线。因此,cython用户不时会查看包含目录是有意义的。

second question解决了abs内置因素,据说它被cython作者忽略了,因为它根本不会将python代码转换为c并调用原始的python 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 。实际上,这个导入只是被忽略了:

abs()
  

__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)&amp;&amp; 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的我的previous question补丁在最后一行变为白色(被编译为c)的意义上修复了它。然而,我不明白为什么忽略了导入abs。

更新3

另一个观察是从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 按预期工作:

composer update --no-scripts

因此,对于cython来说,使用内置设备并不是什么大不了的事。

2 个答案:

答案 0 :(得分:1)

在C中,“内置”或全局可用的绝对值函数abs仅用于整数(长整数为labs)。绝对值函数或浮点数为fabs,可在“ math.h”中找到。

这意味着将libc.stdlib.abs用于整数,将libc.math.fabs用于双精度,并将abs(内置)用于所有Python对象。只有内置的abs才需要GIL。

答案 1 :(得分:0)

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