2017-07-16 9 views
-1

を述べたとき、私は私が働いているプロジェクトに基づくPython用修正リストクラスを作ってみましたと Cythonの拡張モジュールのクラスのメソッドは見えない/

Cython

でそれをスピードアップしようとすることを決定した名前のエラーを与えます私の最初の試みでは、クラスの関数(特殊関数を除く)のほとんどが可視でなく、アクセスできませんでした。

私は、メソッドの名前をcdef、cpdef、defでバウンドしようとしました私は正しい構文を持っているかどうか、また他の誰かが似たような問題を抱えているかどうかを調べるためにグーグルで試みました。

ここに私のコードはあります:

class list_2: 

     cpdef append(self , object item): 
      self._lst = array(self + [item]) 

     cpdef pop(self,int index = -1): 
      temp_lst = array(range(len(self) -1)) 

      if index > len(self)-1 and index >= 0 or index*(-1) > len(len) and index < 0: 
       raise IndexError 
      else: 
       if index <0: 
        index = index*(-1)-1 
       for x in range(len(self)): 
        if x!= index: 
         temp_lst[i] = self[x] 
         i+=1 
       self._lst = temp_lst 
+0

クラスを 'class list_2'と宣言したようです。代わりに、それがcython拡張型であるためには 'cdef class list_2'と宣言する必要があります。さもなければ、cythonはそれを通常のpythonクラスとして扱います。このドキュメントの[このリンク](http://cython.readthedocs.io/ja/latest/src/tutorial/cdef_classes.html)は、cythonクラスについて学ぶのに役立ちます。 – CodeSurgeon

+0

また、リストクラスを再実装しようとすると必ず期待されるパフォーマンス上の利点が得られるかどうかはわかりません。データがすべて単一の型である場合は、cythonの型付きメモリビューを使用するか、代わりにCの配列とポインタを使用することを検討することもできます。なぜ修正リストクラスの作成に興味があるのか​​を知ることは役に立ちます。 – CodeSurgeon

+0

@CodeSurgeonまあ、私が言及したと思うように、クラス宣言に 'cdef'、' cpdef'、 'def'を試してみましたが、それらの関数はクラスに含まれていないという同じ結果を与えてくれました 正に、私はこのクラスをCythonとPythonの練習用にしようとしています 他のアドバイスがあれば幸いです –

答えて

0

ここは、あなたがcythonクラスを使い始めるのを手助けする簡単な例です。まず、自分のsetup.pyファイルを作成します。これはpython setup.py build_ext --inplaceを呼び出してcython .pyxファイルをコンパイルするために使用します。

from distutils.core import setup 
from Cython.Build import cythonize 
from distutils.core import Extension 

extensions = [ 
    Extension("mylist", sources=["mylist.pyx"], libraries=[], extra_compile_args=["-w"]), 
] 
setup(
    ext_modules = cythonize(extensions) 
) 

次に、.pxdファイルを書きます。コメントの中で述べたように、これは基本的には、 "c-side"クラスのすべてのプロパティとメソッドを定義するヘッダファイルで、cdefまたはcpdefで定義されたものです。例mylist.pxdは次のようになります。

cdef class MyList: 
    cdef public list _base_list 
    cpdef append(self, object item) 
    cpdef pop(self, int index=*)#Note: * is used in place of default values 
    cpdef get_data(self) 

は、今、私たちは、実際に仕事をして私たちのmylist.pyxファイルを作成する準備が整いました。簡単にするために、pythonリストを使って私たちのcythonリストを実装します(パフォーマンスにはかなり無意味ですが、配列を掘り下げる必要はありませんが、ややこしいです)。

cdef class MyList: 

    def __cinit__(self):#__cinit__ is preferred for cdef class constructors 
     self._base_list = [] 

    cpdef append(self, object item): 
     self._base_list = self._base_list + [item] 

    cpdef pop(self, int index=-1): 
     self._base_list.pop(index) 

    cpdef get_data(self): 
     return self._base_list 

これがすべてコンパイルされたら、あなたはpythonでこの愚かなMyListクラスを使用することができます。コードは次のようになります。ここでmain.pyファイル内のアクションでMyListです:

from mylist import MyList 

a = MyList() 
a.append("apple") 
a.append("banana") 
a.append("tomato") 
a.append("pear") 
a.pop(2)#one of these fruit is not like the others... 
print a.get_data() 

この例をコンパイルするか、実行している問題が発生している場合は、私に教えてください。私はラップトップでPython 2.7と最新のCythonマスター(バージョン0.26b0)を使ってこれをテストしました。

+0

ありがとう!私はあなたの例を見て、私はそれを働かせました! :) もう1つ質問tho。何人かの人が私の投稿を下落させました。何が間違っているか教えてください/改善するために何ができるのですか?再度、感謝します! –

+0

@Ali Abbas私は個人的にdownvoteしなかった、あなたの質問に正確なエラーメッセージを追加することでした。さもなければ私達はすべてが間違っているものだけを推測することができますまた、サイホンでコードを高速化しようとしているので、Pythonのリストクラスを再実装することはそれを助けません。 'list'、' object'、 'dict'などでcdef変数をタイプすることは、それらのコンテナが文字通り何らかのオブジェクトを保持できるので、実際の型情報は推測できません。また、cythonのドキュメントは素晴らしく、おそらくcdef、cpdef、およびdefに関する混乱が解消されているはずです。 – CodeSurgeon

+0

フィードバックをお寄せいただきありがとうございます –

関連する問題