Ant*_*ins 12 python math cython
如何用Cython设法cimport abs
从libc.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() 。
归档时间: |
|
查看次数: |
2168 次 |
最近记录: |