Es scheint mir, dass jede Instanz einer bestimmten Klasse ihr eigenes Wörterbuch hat. Dies könnte viel Platz verschwenden, wenn eine große Anzahl von identisch strukturierten Klassenobjekten vorhanden ist. Ist dies tatsächlich der Fall oder ist der zugrundeliegende Mechanismus effizienter, erstellen Sie nur das Wörterbuch eines Objekts, wenn es explizit angefordert wird. Ich überlege mir eine Anwendung, in der ich möglicherweise eine sehr große Anzahl von Objekten habe, möglicherweise in Millionen, sollte ich die Verwendung einer Klasse vermeiden und stattdessen eine Sequenz mit einer benannten Konstante als Index verwenden?Dateneffizienz von Klassenobjekten
Antwort
Wenn Sie den Overhead reduzieren möchten, haben Sie zwei Optionen, je nachdem, was Sie tatsächlich benötigen. Wenn Sie eine klassenähnliche Struktur benötigen, sollten Sie in Betracht ziehen, __slots__
zu verwenden. Dies wird die vermeiden, aber Sie können immer noch Methoden, Eigenschaften und so weiter haben. Sie verlieren die Möglichkeit, Attribute dynamisch hinzuzufügen (Sie sind auf die als __slots__
aufgeführten Attribute beschränkt).
Wenn Sie nur einen "Speicher" für Objekte wünschen und keine Methoden und ähnliches benötigen, können Sie collections.namedtuple
verwenden. Diese bieten eine "klassenähnliche" Schnittstelle zu ihren Elementen und sollten ziemlich platzsparend sein.
class Person(object):
__slots__ = ['firstname', 'lastname']
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def __repr__(self):
return '{self.__class__.__name__}({self.firstname!r}, {self.lastname!r})'.format(self=self)
>>> p = Person('Tom', 'Riddle')
>>> p
Person('Tom', 'Riddle')
>>> p.firstname
'Tom'
oder als namedtuple:
Zum Beispiel eine Klasse, die nur zwei Attribute „Nachname“ und „Vorname“ könnte als implementiert werden
>>> from collections import namedtuple
>>> Person = namedtuple('Person', 'firstname, lastname')
>>> p = Person('Tom', 'Riddle')
>>> p
Person(firstname='Tom', lastname='Riddle')
>>> p.firstname
'Tom'
Es ist meiner Meinung nach öfter ein Vorteil, wenn man Mitglieder dynamisch nicht hinzufügen kann. Ich wusste nichts über Nametuple und hätte es sonst für eine gute Lösung gehalten, aber __slots__ scheint überlegen zu sein. –
@ChrisBarry Beide haben ihre Anwendungsfälle. Ich stimme zu, dass "__slots__" besser ist (sie erlauben Methoden und reale Eigenschaften), aber in einigen Fällen wollen Sie nur einen "klassenähnlichen" unveränderlichen Speichercontainer und dann ist "namedtuple" eine brauchbare Alternative. – MSeifert
Das hängt von den Daten ab, die Sie in jedem Objekt speichern möchten, aber in den meisten Fällen sollten Listen genügen.
- 1. Indizierung von Klassenobjekten in solr
- 2. Erstellen von Klassenobjekten in C++
- 3. Deklarieren von Klassenobjekten in einer Header-Datei
- 4. Lesen von einer Textdatei zu Klassenobjekten (C++)
- 5. Kaskadenliste von Klassenobjekten in Python 2.7
- 6. Wie ein Array von Klassenobjekten in Ruby
- 7. Lesen von Datei zu verschiedenen Klassenobjekten
- 8. Template - Klasse Objekt - Struktur von Klassenobjekten
- 9. Alternative zu Klassenobjekten in Python
- 10. PHP Extension: Mit Klassenobjekten arbeiten
- 11. Verwechslung zwischen DTOs (linq2sql) und Klassenobjekten!
- 12. Iterating-Map in C++ mit Klassenobjekten
- 13. Wann beeinflusst die Änderbarkeit von Python-Klassenobjekten Zuweisungen?
- 14. Whiyam bekomme ich dieses unerwartete Verhalten beim Konstruieren von Klassenobjekten?
- 15. Wie initialisiert man ein Array von benutzerdefinierten Klassenobjekten?
- 16. Java: Verwenden einer TreeMap zum Speichern von Klassenobjekten
- 17. Erstellen eines Arrays von Klassenobjekten und Drucken in C++?
- 18. Wie verknüpfe ich Arraylist-Werte mit Klassenobjekten? (Android)
- 19. Sortieren und Gruppieren Verschachtelte Listen Besteht aus Klassenobjekten
- 20. Ich kann nicht in die ArrayList-Datei mit Klassenobjekten schreiben
- 21. Wie füllt man eine Array-Struktur mit Klassenobjekten?
- 22. Sie müssen das Array eines Arrays von Klassenobjekten im View Controller speichern
- 23. Erstellen einer Liste von Klassenobjekten, um sie mit einem anderen Klassenobjekt zu vergleichen
- 24. Mit boost :: python gebe ich eine Liste von exponierten Klassenobjekten zurück, die nicht kopierbar sind
- 25. (Swift 3) Versuchen Sie, ein Array von Klassenobjekten nach Datum in swift 3 zu sortieren?
- 26. Wie kann Java Klassenobjekte deserialisieren, während ihre Identität zu den aktuell geladenen Klassenobjekten erhalten bleibt?
- 27. Wie fülle ich ein 2D-Array mit Klassenobjekten innerhalb einer for-Schleife?
- 28. So weisen Sie Klassenobjekten in einem 2D-Array Werte in Ruby zu
- 29. C++: Speichern von Klassenobjekten in einer Map (Fehler: Nehme die Adresse eines temporären Objekts vom Typ 'Node')
- 30. Python - lesbare Liste von Objekten
Millions ist eine sehr große Zahl nicht, aber Sie sollten sich '__slots__' anschauen. Zum Beispiel hier: http://stackoverflow.com/questions/472000/usage-of-slots –
@Paul Hankin Das sollte eine Antwort gewesen sein, dann hätte ich es upvolotiert haben können. Es ist genau die Antwort, nach der ich gesucht habe. –
Es hat den zusätzlichen Vorteil, dass nur auf Elemente zugegriffen werden kann, die in der Variablen __slots__ benannt sind, sodass Tippfehler früher erkannt werden. Dies sollte in der Python-Dokumentation wirklich viel prominenter sein. –