Pickle Cython Class mit C-Zeigern

Ich versuche ein @ zu schreib__reduce__() -Methode für eine Cython-Klasse, die C-Zeiger enthält, aber bisher nur sehr wenige Informationen darüber gefunden hat, wie dies am besten zu bewerkstelligen ist. Es gibt unzählige Beispiele, wie man ein @ richtig schrei__reduce__() -Methode, wenn numpy-Arrays als Mitgliedsdaten verwendet werden. Ich möchte mich von Numpy-Arrays fernhalten, da sie anscheinend immer als Python-Objekte gespeichert sind und Aufrufe von und zur Python-API erfordern. Ich komme aus einem C-Hintergrund, daher arbeite ich sehr gut manuell mit dem Speicher, indem ich @ anrufmalloc() undfree() und versuche, die Python-Interaktion auf ein absolutes Minimum zu beschränken.

Allerdings bin ich auf ein Problem gestoßen. Ich muss etwas verwenden, das @ entspriccopy.deepcopy() in der Klasse, die ich erstelle, aus dem Python-Skript, in dem es letztendlich verwendet wird. Ich habe festgestellt, dass der einzige gute Weg, dies zu tun, darin besteht, das Beizprotokoll für die Klasse zu implementieren, indem ein @ implementiert wir__reduce__() Methode. Dies ist bei den meisten Primitiven oder Python-Objekten trivial. Ich bin jedoch absolut ratlos, wie dies für dynamisch zugewiesene C-Arrays zu tun ist. Offensichtlich kann ich den Zeiger selbst nicht zurückgeben, da der zugrunde liegende Speicher zum Zeitpunkt der Rekonstruktion des Objekts verschwunden sein wird. Was ist also der beste Weg, dies zu tun? Ich bin sicher, dass dies eine Änderung der beiden @ erforde__reduce__() -Methode sowie eine oder beide der__init__() Methoden.

Ich habe die Python-Dokumentation zum Beizen von Erweiterungstypen gelesenfound here sowie so gut wie jede andere Frage des Stapelüberlaufs beim Auswählen von Cython-Klassen wiediese Frag.

Eine komprimierte Version meiner Klasse sieht ungefähr so aus:

cdef class Bin:
    cdef int* job_ids
    cdef int* jobs
    cdef int primitive_data

    def __cinit__(self):
        self.job_ids = <int*>malloc(40 * sizeof(int))
        self.jobs = <int*>malloc(40 * sizeof(int))

    def __init__(self, int val):
        self.primitive_data = val

    def __dealloc__(self):
        free(job_ids)
        free(jobs)

    def __reduce__(self):
        return (self.__class__, (self.primitive_data))

Antworten auf die Frage(2)

Ihre Antwort auf die Frage