bcolz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
derbernd
User
Beiträge: 13
Registriert: Montag 6. Oktober 2014, 08:19

Hallo,

ich habe in meinem Programm eine definierte Structur aus einer Liste mit einer eigenen Klasse. Momentan sieht die Structur folgendermaßen aus:

Code: Alles auswählen

self.__data.append(ClimateData(self.__zuordnung))

Code: Alles auswählen

class ClimateData(object):
    def __init__(self, nameList):
        self.__data = {}
        self.__means = {}
        self.__parList = nameList
        self.__numElements = {}
def addData(self, parName, data):       
        if len(self.__data[parName]) == 0:       
            for idx,d in enumerate(data):
                self.__data[parName].append(d)
        elif len(self.__data[parName]) == len(data):    
            for idx,d in enumerate(data):
                self.__data[parName][idx] = self.__data[parName][idx]+data[idx]
  • In der Variable self.__zuordnung() bzw. parList werden die Keys für das Dict. gespeichert.
  • Die Klasse speichert Daten (also eine List) in ein Dict. Falls das Dict leer ist wird die Liste dynamisch erweitert, ansonsten werden die Daten des übergebenen Vectors elementweise addiert.
Ich habe jetzt das Problem, dass mir der Speicher vollgeschrieben wird. Somit würde ich die berechnete Datenmenge gern auslagern. Mir ist bei der Recherche die Klasse bcolz aufgefallen. Ist es möglich diese Klasse in meinen Algorithmus zu integrieren? Gibt es noch eine andere sinnvolle Lösung?
BlackJack

@derbernd: Ich würde in einem ersten Schritt ja mal Numpy-Arrays verwenden falls das möglich ist um eine kompaktere Repräsentation der Daten im Speicher zu haben. Dann kann man sich auch ein paar von den Python-Schleifen einsparen, wodurch es dann auch gleich ein bisschen schneller werden könnte.

Sonstige Anmerkungen: Die doppelten führenden Untersstriche sollten einfache führende Untersstriche sein. Und falls Du für irgendetwas davon triviale Getter- und Setter-Methoden geschrieben hast, dann kannst Du die entfernen und gar keinen Unterstrich verwenden.

Die Methoden-, Attribut-, und Variablennamen entsprechen nicht den Empfehlungen aus dem Style Guide for Python Code.

Konkrete Datentypen sollte man nicht in Namen schreiben. Wenn man den konkreten Typ im Laufe der Entwicklung ändert, dann muss man auch den Namen ändern, oder man hat falsche, irreführende Namen im Quelltext stehen.

Ich sehe beim gezeigten Code nicht wie `addData()` etwas machen kann, denn `self.__data` ist ja leer also wird keiner der beiden Zweige in der Methode ausgeführt.

In der ersten Schleife wird `idx` nicht verwenden und die Schleife sieht mir auch sehr nach einem selbst geschriebenen `extend()` aus. Oder man weist einfach `data` zu statt die Elemente umzukopieren.

Im zweiten Zweig wird `idx` zwar verwendet, aber ich hätte da eher `zip()` oder `itertools.izip()` verwendet statt eines Index und eine neue Liste mit einer „list comprehension” erzeugt und zugewiesen. Oder eben gleich ein Numpy-Array, dann bräuchte man nicht einmal eine Schleife in Python schreiben.

Es fehlt ein ``else``-Zweig. Selbst wenn der nach der Programmlogik nie genommen werden wird, sollte man dort ein ``assert False, '<beschreibung des falls>'`` unterbringen. Es ist oft überraschend wie häufig Sachen passieren die eigentlich nicht passieren dürften. So etwas sollte nicht ”lautlos” unter den Tisch fallen.
derbernd
User
Beiträge: 13
Registriert: Montag 6. Oktober 2014, 08:19

@BlackJack: Danke für die Hinweise. Da ich kein Informatiker bin, sind gewisse Sachen halt selbstverschuldet. Weiterhin bin ich Neuling im python, aber ich werde möglichst viele Dinge aus dem Style Guide für die Zukunft berücksichtigen.
Antworten