Я пытаюсь сделать сложную экспоненту в Cython.Использование сложных функций C++ в Cython
я смог сколотить следующий код для моего pyx
:
from libc.math cimport sin, cos, acos, exp, sqrt, fabs, M_PI, floor, ceil
cdef extern from "complex.h":
double complex cexp(double complex z)
import numpy as np
cimport numpy as np
import cython
from cython.parallel cimport prange, parallel
def try_cexp():
cdef:
double complex rr1
double complex rr2
rr1 = 1j
rr2 = 2j
print(rr1*rr2)
#print(cexp(rr1))
Обратите внимание, что print(cexp(rr1))
комментируется. Когда линия активна, я получаю следующее сообщение об ошибке при запуске setup.py
:
error: command 'C:\\WinPYthon\\Winpython-64bit-3.4.3.6\\python-3.4.3.amd64\\scripts\\gcc.exe' failed with exit status 1
Обратите внимание, что, когда cexp
закомментирована, все работает как ожидается ... Я могу запустить setup.py
, и когда я проверить функцию он печатает произведение двух комплексных чисел.
Это мой setup.py
файл. Обратите внимание, что он включает в себя код для запуска openmp
в Cython с помощью г ++:
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np
import os
os.environ["CC"] = "g++-4.7"
os.environ["CXX"] = "g++-4.7"
# These were added based on some examples I had seen of cexp in Cython. No effect.
#import pyximport
#pyximport.install(reload_support=True)
ext_modules = [
Extension('complex_test',
['complex_test.pyx'],
language="c++",
extra_compile_args=['-fopenmp'],
extra_link_args=['-fopenmp', '-lm']) # Note that '-lm' was
# added due to an example where someone mentioned g++ required
# this. Same results with and without it.
]
setup(
name='complex_test',
cmdclass={'build_ext': build_ext},
ext_modules=ext_modules,
include_dirs=[np.get_include()]
)
В конечном счете моя цель состоит в том, чтобы ускорить calcualtion, который выглядит как k*exp(z)
, где k
и z
являются сложными. В настоящее время я использую числовые выражения, однако у меня большие издержки памяти, и я считаю, что можно оптимизировать дальше, чем может.
Благодарим за помощь.
Вы нашли их быстрее, чем 'cmath'? –
Ну, я изначально пытался сделать свою сложную экспоненту, используя закон Эйлера с синусами и косинусами, но это было не так эффективно, как я надеялся –
Ну ладно, но вы еще пробовали 'cmath'? –