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来说,使用内置设备并不是什么大不了的事。
答案 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()。