Frage

Zum Beispiel, wie viel Speicher benötigt, um eine Liste von einer Million (32-Bit) ganzen Zahlen zu speichern?

alist = range(1000000) # or list(range(1000000)) in Python 3.0
War es hilfreich?

Lösung 2

Nützliche Links:

wie die Speichergröße erhalten / Nutzung von Python-Objekt

Speichergrößen von Python-Objekte?

, wenn Sie Daten in Wörterbuch setzen, wie berechnen wir die Datengröße ?

Allerdings geben sie keine definitive Antwort. Der Weg zu gehen:

  1. Messen Speicher von Python-Interpreter verbraucht mit / ohne die Liste (Verwendung OS-Tools).

  2. Mit einem Drittanbieter-Erweiterungsmodul, das eine Art von sizeof definiert (PyObject).

Aktualisieren :

Rezept 546530: Größe der Python-Objekte (überarbeitet)

import asizeof

N = 1000000
print asizeof.asizeof(range(N)) / N
# -> 20 (python 2.5, WinXP, 32-bit Linux)
# -> 33 (64-bit Linux)

Andere Tipps

"Es hängt davon ab." Python reserviert Speicherplatz für Listen in einer solchen Art und Weise zu erreichen konstante Zeit amortisieren Elemente zum Anhängen an die folgende Liste.

In der Praxis, was das bedeutet mit der aktuellen Implementierung ist ... die Liste immer Platz für eine Potenz von zwei Anzahlen von Elementen zugeordnet ist. So Bereich (1000000) wird vergeben tatsächlich eine Liste groß genug, um 2 ^ 20 Elemente zu halten (~ 1.045.000).

Dies ist nur der Platzbedarf der Listenstruktur zu speichern, selbst (die für jedes Element ein Array von Zeigern auf die Python Objekten ist). Ein 32-Bit-System 4 Byte pro Element benötigt, ein 64-Bit-System 8 Byte pro Element verwendet wird.

Darüber hinaus müssen Sie Platz, um die tatsächlichen Elemente speichern. Dies ist sehr unterschiedlich. Für kleine ganze Zahlen (-5 bis 256 zur Zeit), wird kein zusätzlicher Platz benötigt wird, aber für größere Zahlen Python zuordnet, ein neues Objekt für jede ganze Zahl, die 10-100 Bytes nimmt und neigt dazu, Speicher fragmentieren.

Fazit: Es ist kompliziert und Python-Listen sind nicht ein guter Weg, um große homogene Datenstrukturen zu speichern. Dazu verwenden Sie das array Modul oder, wenn Sie vektorisiert Mathematik tun müssen, verwenden Sie NumPy.

PS- Tupeln, im Gegensatz zu Listen, sind nicht entworfen Elemente haben progressiv sie angehängt. Ich weiß nicht, wie die allocator funktioniert, aber denken Sie nicht einmal über sie für große Datenstrukturen: -)

Adressierung "Tupel" Teil der Frage

Erklärung CPython dem PyTuple in einer typischen Build-Konfiguration läuft darauf hinaus, diese nach unten:

struct PyTuple {
  size_t refcount; // tuple's reference count
  typeobject *type; // tuple type object
  size_t n_items; // number of items in tuple
  PyObject *items[1]; // contains space for n_items elements
};

Größe von PyTuple Instanz festgelegt ist während es Konstruktion ist und kann nachträglich nicht geändert werden. Die Anzahl der Bytes von PyTuple besetzt als

berechnet werden
  

sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1).

Das gibt flach Größe des Tupels. Um voll Größe, die Sie auch Gesamtzahl der Bytes verbraucht durch Objektgraph wurzelt in PyTuple::items[] Array hinzufügen müssen.

Es ist erwähnenswert, dass Tupel Bau Routinen sicherstellen, dass nur einzelne Instanz leerer Tupel wird jemals erstellt (Singleton).

Referenzen: Python.h , object.h , tupleobject.h , tupleobject.c

  

Eine neue Funktion, getsizeof(), nimmt ein   Python-Objekt und gibt den Betrag   durch den Gegenstand des Speichers verwendet, gemessen,   in Bytes. Built-in-Objekte Rückkehr   korrekte Ergebnisse; dritte Seite   Erweiterungen können nicht, kann aber ein definieren   __sizeof__() Methode die Größe des Objekts zurück.

kveretennicov@nosignal:~/py/r26rc2$ ./python
Python 2.6rc2 (r26rc2:66712, Sep  2 2008, 13:11:55) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
>>> import sys
>>> sys.getsizeof(range(1000000))
4000032
>>> sys.getsizeof(tuple(range(1000000)))
4000024

Offensichtlich zurück Zahlen nicht Speicher durch enthaltenen Objekte (sys.getsizeof (1) == 12) verbraucht sind.

Dies ist die Umsetzung spezifisch, ich bin mir ziemlich sicher. Sicher es auf der internen Darstellung von ganzen Zahlen abhängt - Sie können nicht annehmen, dass sie gespeichert werden werden als 32-Bit, da Python gibt Sie beliebig große ganze Zahlen so vielleicht kleine Ints sind kompakter gespeichert.

Auf meinem Python (2.5.1 auf Fedora 9 auf Core 2 Duo) die VmSize vor der Zuteilung ist 6896kB nach ist 22684kB. Nach einer weiteren Million Elemente Zuordnung geht VmSize zu 38340kB. Dies zeigt sehr grob um 16000kB für 1000000 ganze Zahlen, die um 16 Byte pro ganze Zahl ist. Das deutet auf ein Los von Overhead für die Liste. Ich würde diese Zahlen mit einer großen Prise Salz nehmen.

Ich bin vorsichtig, warum Sie fragen. Versuchen Sie, um herauszufinden, wie viel Speicher Sie für eine gegebene Implementierung benötigen? Sprich: Sie gehen 10.000.000 Widgets lesen und wollen wissen, wie viel RAM sie saugen?

Wenn das der Fall ist, anstatt zu versuchen, wie viel RAM jedes Widget nimmt, um herauszufinden, herauszufinden, wie viel RAM, sagen wir, 10.000 Widgets nimmt und multiplizieren Sie Ihre tatsächliche Größe zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top