文字列フィールドを持つ拡張タイプ(cdef class
)があります。私はそれを宣言する最良の方法が何か分かりません。Cython拡張タイプのPython文字列
cdef class Box:
cdef char *_s
cdef public str s1
cdef public bytes s2
property s:
def __get__(self):
cdef bytes py_string = self._s
return py_string
def __init__(self, s):
cdef char *aux = s
self._s = aux
self.s1 = s
self.s2 = s
と拡張タイプを使用して次のコードを想定し
>>> import test as t
>>> b = t.Box("hello")
>>> b.s
'hello!'
>>> b.s1
'hello'
>>> b.s2
'hello'
>>> type(b.s)
<type 'str'>
>>> type(b.s1)
<type 'str'>
>>> type(b.s2)
<type 'str'>
彼らはすべての作業が、私は、ガベージコレクションとStringオブジェクトの寿命のような問題についてはよく分かりません。私はchar *
+プロパティのアプローチが3つの中で最も効率が悪いので好きではありません。
私の質問です:これを行う最善の方法は何ですか? cdef public str s
は安全ですか?
EDIT:
まあcdef public str s
は限りBox
への参照がどこかに保持されているとして正常に動作するようです。
>>> gc.collect()
0
>>> gc.is_tracked(b)
True
>>> gc.get_referrers(b.s1)
[<test.Box object at 0x1a4f680>]
>>> gc.get_referrers(b.s2)
[<test.Box object at 0x1a4f680>]
>>> b.s1
'hello'
ありがとうございます。
私は、生成されたc/C++コードを調べることが非常に役立つことがよくあります。だから、シーンの裏に何が起こっているのかが分かる。 – rocksportrocker
ありがとう、私はそれを助けた:それは助けた:) – Alex