それはその間のどこかにあります。それはサポートされておらず、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]
関数呼び出しの外で静的配列を割り当てる必要があるのはなぜですか?