2017-07-26 1 views
0

Ich verstehe, dass in Cython ich kann nicht ein Array innerhalb einer Schleife cdef, ich muss dies vor der Schleife tun. Was passiert, wenn ich innerhalb der Schleife das Array, das ich außerhalb der Schleife initialisiert habe, bei jeder Iteration auf sehr unterschiedliche Größen gesetzt habe?cdef ein Array in Cython, das die Größe in einer Schleife ändert, gibt es Speicherprobleme?

etwas wie folgt vorstellen:

cdef int i 
cdef int [:] A 
for i in range(100): 
    A = np.zeros(np.random.randint(10, 1000), dtype=np.int32) 

Die Größe des A stark von Iteration zu Iteration variieren. Könnte dies zu irgendeiner Art von Speicherproblemen führen? Könnte jemand erklären, was genau in Erinnerung ist, wenn ich durch die Schleife gehe? Wenn das problematisch ist, gibt es Alternativen? Danke

+0

Ich würde vorschlagen, diese Schleife in der anrufenden Putten Python-Code und Aufruf der Cython-Funktion mit dem 2d 'A'-Array. Konzentrieren Sie sich darauf, Geschwindigkeit zu gewinnen, wenn Sie 'A' verarbeiten. Wenn Sie 'A' so erstellen, wird Cythons Kompilierung nicht genutzt. – hpaulj

Antwort

1

Keine Probleme - Memoryviews sind Referenz gezählt wie normale Python-Objekte so, wenn das neue Array A zugeordnet ist, fällt die Referenzzahl des alten auf 0 und es ist befreit.

Die einzige Ausnahme hier ist, wo Sie die Speicheransichten von einem Zeiger und nicht ein Python-Objekt erstellen, in diesem Fall müssen Sie den Speicher behandeln. Das gilt jedoch nicht hier.

(Wie @hpaulj in einem Kommentar sagt, das wird keine Beschleunigung von Cython bekommen, aber ich nehme an, Ihre echten Code tut ein bisschen mehr Arbeit in der Schleife)

Verwandte Themen