Wie dynamisch reservieren Speicher in Python
Gibt es eine Methode in python, das ich verwenden kann, um ein sperren von Speicher aus dem heap ,und verwenden Sie eine variable zu referenzieren. Genau wie das Schlüsselwort "new" , oder die Funktion malloc()
in anderen Sprachen:
Object *obj = (Object *) malloc(sizeof(Object));
Object *obj = new Object();
In das Projekt, mein Programm ist warten, um zu erhalten, einige Daten in ungewissen Abständen und mit einer bestimmten Länge in bytes, wenn richtig.
Früher habe ich es wie folgt:
void receive()// callback
{
if(getSize()<=sizeof(DataStruct))
{
DataStruct *pData=malloc(sizeof(DataStruct));
if(recvData(pData)>0)
list_add(globalList,pData);
}
}
void worker()
{
init()
while(!isFinish)
{
dataProcess(globalList);
}
}
Nun, ich migrieren möchten diese alte Projekt zu python, und ich habe versucht, es zu tun mögen dieses:
def reveive():
data=dataRecv()
globalList.append(data)
Allerdings bekomme ich die alle Artikel in der Liste sind gleich, und gleich die neueste Einzelteil. Es ist offensichtlich, dass alle die Elemente der Liste sind auf den gleichen Speicher-Adresse, und ich will mir neuen Speicher-Adresse jeweils die Funktion aufgerufen wird.
- Was ist globalList in python? Eine lokale variable?
- Sie versuchen nicht, das problem zu lösen in der richtigen Weise. Python ist eine übergeordnete Sprache, die Sie don ' T allocate memory. Wenn Sie zeigen
dataRecv
definition (oder was auch immer das dann nennt - ein minimale reproduzierbare Beispiel, bitte) es könnte klarer sein, was das eigentliche problem ist. Meine Vermutung ist, du bist entleeren und wiederverwenden einer einzelnen Liste-Objekt, anstatt ein neues zu erstellen. Eventuell haben Sie die gefürchtete änderbaren Standard-argument. - danke,dataRecv ist aus einem anderen import-Modul,und ich übergehe das argument, das verwendet werden, um rufen dataRecv.Ich Druckdaten in reveive() ,dann ist es richtig.Wie Sie sagen,ich bin nicht eine neue Liste zu erstellen-Objekt.das ist genau das, was ich Fragen ,ich brauche eine Methode, um zu erreichen das Schlüsselwort "new" in c++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das äquivalent der "neue" in python ist nur ein Konstruktor, der z.B.:
Da Sie mit der Portierung von C, einige Dinge zu beachten.
Alles ist ein Objekt in python-einschließlich der ganzen zahlen, und die meisten Variablen sind nur Verweise, aber die Regeln für Skalare Variablen wie Integer und strings sind Verschieden von Behältern, wie zB:
Jedoch:
Können Sie vorab reservieren Größen, wenn Sie möchte, aber es oft nicht kaufen Sie viel profitieren in python. Folgendes gilt:
Wenn Sie sicherstellen möchten, memory Leckagen nicht auftreten, verwenden Sie lokale Variablen so oft wie möglich, z.B. innerhalb einer Funktion, so wie die Dinge gehen aus dem Bereich, den Sie nicht haben sorgen zu machen.
Zur effizienten vektorisierte Operationen (und wesentlich geringeren memory-footprint) verwenden numpy-arrays.
Meine zwei Cent:
Ich würde wahrscheinlich beginnen mit der Frage, was das primäre Ziel ist. Es ist die pythonic Möglichkeiten, Dinge zu tun, während versuchen, um eine Optimierung für die Geschwindigkeit der Programmausführung oder minimalen Speicherbedarf. Und dann gibt es der Aufwand versuchen, ein fertiges Programm in so wenig Zeit wie möglich. Manchmal sind Sie alle überschneiden, aber mehr oft finden Sie die pythonic Weg, um schnell zu übersetzen, aber mit höheren Anforderungen an den Arbeitsspeicher. Immer höher, die Leistung von python wird wohl noch konzentriert erleben.
Viel Glück!
Lesen Sie die Python-tutorial.
Können Sie erstellen Listen, Wörterbücher, Objekte und closures in Python. Alle diese Leben in der (Python -) heap, und Python hat eine naive garbage collector (reference counting + Kennzeichnung für zirkularität).
(das Python-GC ist naiv, weil es nicht verwenden ausgefeilte GC-Verfahren; es ist daher langsamer als z.B. Ocaml oder viele JVM-generational copying garbage-Kollektoren; Lesen Sie die GC-Handbuch für mehr; aber der Python GC ist viel mehr freundlich zu externen C-code)
Beachten Sie, dass interpretierte Sprachen in der Regel nicht abflachen der Arten als kompilierte Sprachen. Das Speicher-layout ist (wahrscheinlich) völlig anders als in den Rohdaten. Daher können Sie nicht einfach werfen die Rohdaten, um eine Instanz der Klasse oder Umgekehrt. Lesen Sie die raw-Daten, interpretieren Sie und füllen Sie Ihre Objekte manuell.