0

Cythonに移植しようとしているc++ファイルで定義されたdoubleの静的配列があります。

Cythonで静的Cアレイを作成できますか?の推奨事項に従いました。係数のハードコードされた配列を使用するのは、リストを回避できる方法がある場合にリストにインデックスを付ける必要がないためです(コードのパフォーマンスに非常に敏感なセグメントであるため、速度が非常に重要です)。それ以外の場合は、リストなどを使用できます。コードを書くのは簡単ですが、遅すぎます。

私の配列コードの実装(.PXDファイル内)は次のようになります

cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]

そして、a_radial [0]のような配列の要素(pure-python-mode .pyファイル内)を参照しようとすると、クラッシュが発生し、例外は生成されません。これはバグですか?それとも私は愚かなことをしていますか?

ありがとう、イアン

4

1 に答える 1

0

それはその間のどこかにあります。それはサポートされておらず、Cython の人々はそれについて知っています。

http://trac.cython.org/cython_trac/ticket/113

私は2つの異なることを試しました:

cdef get_list():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    return a_radial

def get_list():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    return a_radial

どちらの場合も、正しくコンパイルされません。本当にサポートされていないようです。

Cython を強制して、静的配列を作成できるようにすることができましたが、メソッド呼び出し内でのみ可能でした。それは、それらの場合に配列をどこに配置するか(スタック)を知っていると思いますが、モジュールレベルでは、どこに行くのでしょうか? ヒープ?それを割り当てるメカニズムは何ですか?また、pure-python モードで配列にアクセスする場合は、Python が理解できるものに変換する必要がありますが、C 配列は理解できません。Python オブジェクトまたは Cython が自動的に Python オブジェクトに変換できるもののみを返すことができます。

パフォーマンスが問題になる場合は、これを C モード コードに保持しても問題ありません。python-mode にする必要がある場合、1 つの場所で静的配列を宣言し、python リストも宣言することの何が問題なのですか。更新を容易にするために、これらは 1 行ずつ離すことができます。

cdef class Fun:
    a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    def do_calcs(self):
        cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
        print a_radial[0]

パフォーマンスに敏感なすべてのものを単一の python メソッド呼び出しにラップすることはできませんか? 単一の関数内で静的配列を見つけることもできました。

def do_calcs():
    cdef double *a_radial = [25932.1070099 , 0.914825434095 , -177.588568125 , -0.237052788124 , -172347.610527 , -12.0687599808 , -0.0128861161041 , -151.202604262 , -0.999674457769 , 0.0161435039267 , 0.825533456725]
    print a_radial[0]

関数呼び出しの外で静的配列を割り当てる必要があるのはなぜですか?

于 2012-12-11T22:35:56.627 に答える