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最後に、 「MyList1」と呼ばれる、必要なリストを取得するために実行するpython スクリプトを呼び出します。

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 (最初のファイル Myfunc.pyx を参照)を使用しb.subs(x,xa)て x を取り除き、それを xa に置き換えて、最終的に記号解ではなく数値解を得ます。2) 3 番目のファイル (calc.py) の一番上にあるのは使用すべきではないと思いますimport Myfuncが、それ以外のものは取得できません。私がすべきだと思うこと: setup.py を実行すると、Myfunc.c と Myfunc.so という 2 つの新しいファイルが作成されたので、calc.py ファイルを実行するだけで、純粋な python で数値が速くなるはずです. 何をしなければならないか:ついにわからない... できれば欲しいもの: exp()anda.subs(x,xa)b.subs(x,xa)計算が遅くなると思います。このコードを純粋な python から「cython」に変換しようとしました (変換はこれを説明するのに適した言葉ではないと思います)。公式サイトのチュートリアルは私には少し難しいので、いつもこれを達成できません。私のホバークラフトはウナギでいっぱいなので、私の英語を許してください

4

2 に答える 2

4

SymPy でシンボリック式から開始し、高速な数値コードで終了する方法は多数あります。

  • SymPy のコード生成を調べることができます

  • lamdify 関数を調べることができます

于 2012-08-18T01:19:18.500 に答える
4

sympy と cython を組み合わせることはできません。Cython は、cdef クラスと宣言された変数を C に変換してコンパイルすることにより、Python を高速化します。sympy.Symbol またはその他の sympy 関数には、同等の C++ がないため、C にコンパイルできず、速度が向上しません。

もっと具体的に。awithで宣言するとfloat a、sympy 型ではなく C の double になります。したがって、.subsメソッドはありません。(そしてそれは持つことができません)

あなたが取り組んでいることを理解していれば、numpy は cython よりもはるかに優れたソリューションです。基本的に numpy.arrays は C データ型です。それらを使用して計算を実行すると、C++ の速度で実行されます。sympy で numpy を使用する方法が文書化されています。なんらかの理由で numpy で意図したことを達成できない場合 (可能性は低い) numpy は cython でもうまく機能します。

于 2012-08-13T22:38:54.170 に答える