2

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

4

2 回答 2

4

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

更具体地说。当您声明awith 时float a,它是 C double 而不是 sympy 类型。因此它没有.subs办法。(它不能有)

如果我了解您正在研究的内容,numpy 是比 cython 更好的解决方案。本质上 numpy.arrays 是 C 数据类型。当您使用它们执行计算时,它会以 C++ 速度发生。它记录了如何将 numpy 与 sympy 一起使用。如果由于任何原因您无法使用 numpy(不太可能)实现您的意图,那么 numpy 仍然可以很好地与 cython 一起使用。

于 2012-08-13T22:38:54.170 回答
4

有多种方法可以从 SymPy 中的符号表达式开始,并以快速数字代码结束。

  • 您可以查看 SymPy 的代码生成

  • 您可以查看 lamdify 功能

于 2012-08-18T01:19:18.500 回答