gpt4 book ai didi

python - 在 cython 中定义和使用数学函数

转载 作者:行者123 更新时间:2023-11-28 20:26:26 24 4
gpt4 key购买 nike

我是 python 的新手,正在努力让 cython 加速我的一些计算。我已经尝试了我能想到的所有可能的方法,但似乎我还不了解某些东西,所以我惨遭失败。我有这些文件:第一个叫做 Myfunc.pyx:

import math
from sympy import Symbol
x = Symbol('x')


wi=10

cdef float MyList(float a,float b):
return [(xa,ya,wi+a.subs(x,xa)*math.sin(xa)*b.subs(x,xa)*math.exp(1/ya**2)) for xa in range(1,5001,10) for ya in range(-2501,2501,10)]

setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules=[
Extension("Myfunc",
["Myfunc.pyx"],
libraries=["m"]) # Unix-like specific
]

setup(
name = "Demos",
cmdclass = {"build_ext": build_ext},
ext_modules = ext_modules
)

最后是名为 calc.py 的 python 脚本,我运行它来获取我想要的列表,名为“MyList1”:

import Myfunc
from sympy import Symbol
import math

x = Symbol('x')


a1=(10*x)**(0.5)
b1=(20*x)**(0.5)
wi=10


MyList1=Myfunc.MyList(a1,b1)
print MyList1

现在澄清一下:1) x,y在之前的脚本中纯粹作为推导公式的符号。我使用 a.subs(x,xa)b.subs(x,xa)(参见第一个文件 Myfunc.pyx)来去掉 x 和将其替换为 xa 以最终获得数字而非符号解决方案。 2) 我认为在第三个文件 (calc.py) 的顶部我不应该使用 import Myfunc 但我没有得到其他东西。 我认为我应该做的: 运行 setup.py,然后因为创建了 2 个新文件 Myfunc.c 和 Myfunc. 所以我只运行 calc.py 文件,据说我会有我的数字在纯 python 中更快。 必须做什么:我终于不知道... 如果可能我想要什么 exp()a. subs(x,xa)b.subs(x,xa) 我认为会减慢我的计算速度。我尝试将这段代码从纯 python 转换为“cython”(我认为转换不是描述这个的好词)。官方网站上的教程对我来说有点难以理解,所以我总是无法做到这一点。请原谅我的英语不好,因为我的气垫船里装满了鳗鱼

最佳答案

无法将 sympy 与 cython 结合使用。 Cython 通过将 cdef 类和声明的变量翻译成 C 并编译它来加速 python。 sympy.Symbol 或任何其他 sympy 函数没有 C++ 等价物,因此不能编译成 C,因此没有加速。

更具体一点。当您使用 float a 声明 a 时,它是 C double 而不是 sympy 类型。因此它没有 .subs 方法。 (它不能有)

如果我明白你在做什么,numpy 是比 cython 更好的解决方案。本质上 numpy.arrays 是 C 数据类型。当您使用它们执行计算时,它会以 C++ 的速度发生。记录了如何将 numpy 与 sympy 一起使用。如果出于任何原因你无法使用 numpy 实现你想要的(不太可能)numpy 仍然可以很好地与 cython 一起工作。

关于python - 在 cython 中定义和使用数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com