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 代码。