1

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)
4

2 に答える 2

2

@cython.cfunc(と同等cdef、つまり C からのみ呼び出し可能) を@cython.ccall(と同等cpdef、つまり、遅い Python 呼び出し規則と高速 C 呼び出し規則の両方を使用してアクセス可能) に置き換える必要があります。

于 2013-07-15T09:36:35.200 に答える
2

@cython.cfuncdecorator はcdef関数を ing することと同等であるため (詳細はこちらを参照)、この関数はCコード内でのみアクセスできます。したがって、Python からアクセスできるようにするには、@cython.cfunc.

于 2013-03-01T09:56:35.123 に答える