Cythonデコレータを使用してPurePythonを作成したいのですが、NONE.PYの名前をNONE.PYXに変更すると、エラーが発生します。この問題を回避するには、各属性をデコレータなしの純粋なPython定義呼び出しでラップする必要があります。なんで…
ここでモジュールnone.pyx(名前をnone.pyに変更すると、問題はまったく発生しません)
import cython
@cython.cfunc
@cython.returns(cython.double)
@cython.locals(n=cython.int,i=cython.int,r=cython.int)
def ccrange(n):
r=0
for i in range(n):
r+=i
return r
def crange(n): return ccrange(n)
およびPythonテストファイルtest_none.py:
import pyximport; pyximport.install()
import none
n=10000
print ">>pure python call>>",none.crange(n)
print ">>cython call>>",none.ccrange(n)
none.pyxの結果:
pure python call >> 49995000.0 cython call >> Traceback(最新の呼び出しが最後):ファイル "C:\ Users \ damien \ python4d \ bacoland \ test_none.py"、6行目、印刷 ">> cython call >>"、 none.ccrange(n)
AttributeError:'module'オブジェクトに属性'ccrange'がありません
none.pyxの名前をnone.pyに変更し、次のようにします。
純粋なPython呼び出し>>49995000cython呼び出し>>49995000
手伝ってくれてありがとう!ごきげんよう :-)
編集:デコレータ@cython.cfuncがcythonの速度の利点を壊しているのを避けてください...@cython.cfuncがある場合とない場合の次のコードを検討してください。
@cython.cfunc
@cython.returns(cython.double)
@cython.locals(n=cython.int)
def fibo_c(n):
if n == 0 or n == 1:
return n
return fibo_c(n-2) + fibo_c(n-1)