2015-11-22 2 views
6

Ich möchte eine cython Array einer cdef Klasse haben:cython: wie man ein Array von cdef Klasse erstelle

cdef class Child: 
    cdef int i 

    def do(self): 
     self.i += 1 

cdef class Mother: 
    cdef Child[:] array_of_child 

    def __init__(self): 
     for i in range(100): 
      self.array_of_child[i] = Child() 
+1

Haben Sie Grund zu der Annahme, dass meine Antwort nicht mehr aktuell ist? Ich habe mir das Changelog angeschaut und kann dort nichts Offensichtliches sehen. Ich denke, es gibt gute technische Gründe, warum sich das kaum ändern wird. – DavidW

+0

Was meinen Sie mit "Cython-Array einer Cdef-Klasse"? Entspricht es C++ 's Child a [n] 'für einige' n' oder 'Child *'? Es gibt offensichtlich einige Probleme in Ihrem Code (es sollte 'self.array_of_child' sein, Speicher für' array_of_child' sollte zugewiesen und dann freigegeben werden), so dass das Beheben dieser Probleme klarer machen wird, was Sie versuchen zu erreichen. – ead

Antwort

8

Ich denke, die Antwort ist nein: newsgroup post of essentially the same question

Im Wesentlichen das Array würde ein Array von Zeigern zu Ihrem Child sein, anstatt eine direkte Anordnung von Child s. Es muss so sein, denn wo sonst jemals ein Verweis auf eine Child im Array kommt, muss Child am Leben gehalten werden (aber nicht das ganze Array), was nicht wirklich möglich wäre, wenn sie den gleichen Teil von Erinnerung.

Die im Newsgroup-Post vorgeschlagene Arbeitsumgebung besteht lediglich darin, eine Python-Liste zu verwenden. Sie könnten auch ein Nummernfeld mit dtype=object verwenden. Wenn Sie eine cdef Funktion in der Klasse zugreifen müssen, können Sie eine Besetzung zuerst tun:

cdef Child c = <Child?>a[0] # omit the ? if you don't want 
          # the overhead of checking the type. 
c.some_cdef_function() 

Eine weitere Möglichkeit könnte sein, Ihre Daten als C-Struktur zu speichern (cdef struct ChildStruct: ....), die leicht als Array gespeichert werden kann . Wenn Sie eine Python-Schnittstelle für diese Struktur benötigen, können Sie entweder Child definieren, so dass sie eine Kopie von ChildStruct enthält (aber Änderungen werden nicht an das ursprüngliche Array weitergegeben), oder einen Zeiger auf ChildStruct (aber Sie müssen darauf achten, dass der Speicher ist nicht frei, der Child zeigt, ist lebendig).

Verwandte Themen