Cython 中的复数 - I 还是 1j?
Complex Numbers in Cython - I or 1j?
每当我尝试在 Cython 中进行简单的复杂算术运算时,我似乎都会得到一些 Python 开销;这与使用 Pythonic 1j
有什么关系吗?在这一点上,我找不到任何方法将 C 风格的虚部导入 Cython。这可能吗?
例如,下面的简单 Cython 函数将极坐标复数转换为矩形形式。 (注意这是使用从 "complex.h"
库导入的 cos 和 sin)
cdef float complex rect(float r, float phi):
return r*cos(phi) + r*sin(phi)*1j
此代码被 Cython 转换为以下 C 代码:
__pyx_t_1 = __Pyx_c_sum(__pyx_t_double_complex_from_parts((__pyx_v_r * cos(__pyx_v_phi)), 0), __Pyx_c_prod(__pyx_t_double_complex_from_parts((__pyx_v_r * sin(__pyx_v_phi)), 0), __pyx_t_double_complex_from_parts(0, 1.0)));
__pyx_r = __pyx_t_float_complex_from_parts(__Pyx_CREAL(__pyx_t_1), __Pyx_CIMAG(__pyx_t_1));
goto __pyx_L0;
考虑到此函数的简单性质,它似乎应该能够转换为纯 C,但它仍然部分处于 Python 领域 - 我是否缺少某些东西以便将此语句转换为纯 C?
可以使用 complex.h
中的 I
而不是 1j
,如:
cdef extern from "complex.h":
double cos(double x) nogil
double sin(double x) nogil
float complex I
def rect(r, phi):
return crect(r, phi)
cdef float complex crect(float r, float phi):
cdef float rpart = r*cos(phi)
cdef float ipart = r*sin(phi)
return rpart + ipart * I
cython -a
报告 crect
没有 Python 代码。
每当我尝试在 Cython 中进行简单的复杂算术运算时,我似乎都会得到一些 Python 开销;这与使用 Pythonic 1j
有什么关系吗?在这一点上,我找不到任何方法将 C 风格的虚部导入 Cython。这可能吗?
例如,下面的简单 Cython 函数将极坐标复数转换为矩形形式。 (注意这是使用从 "complex.h"
库导入的 cos 和 sin)
cdef float complex rect(float r, float phi):
return r*cos(phi) + r*sin(phi)*1j
此代码被 Cython 转换为以下 C 代码:
__pyx_t_1 = __Pyx_c_sum(__pyx_t_double_complex_from_parts((__pyx_v_r * cos(__pyx_v_phi)), 0), __Pyx_c_prod(__pyx_t_double_complex_from_parts((__pyx_v_r * sin(__pyx_v_phi)), 0), __pyx_t_double_complex_from_parts(0, 1.0)));
__pyx_r = __pyx_t_float_complex_from_parts(__Pyx_CREAL(__pyx_t_1), __Pyx_CIMAG(__pyx_t_1));
goto __pyx_L0;
考虑到此函数的简单性质,它似乎应该能够转换为纯 C,但它仍然部分处于 Python 领域 - 我是否缺少某些东西以便将此语句转换为纯 C?
可以使用 complex.h
中的 I
而不是 1j
,如:
cdef extern from "complex.h":
double cos(double x) nogil
double sin(double x) nogil
float complex I
def rect(r, phi):
return crect(r, phi)
cdef float complex crect(float r, float phi):
cdef float rpart = r*cos(phi)
cdef float ipart = r*sin(phi)
return rpart + ipart * I
cython -a
报告 crect
没有 Python 代码。