ich benötige mal wieder eure Hilfe. Mit Performance habe ich mich noch nie intensiv beschäftigt, da das für mich noch nie ein Problem war. Jetzt habe ich aber einen Code erhalten, der ist sehr langsam. Mit messen habe ich dann herausgefunden, dass ein Problem darin liegt, dass Ergebnisse mit `append` ein er Liste hinzugefügt wurden. Die Messung hat auch gezeigt, dass mit steigender Listenlänge, die Zeit hierfür auch anstieg. Hier wird ja nichts angehängt, sondern jedes mal eine neue Liste erzeugt, richtig? Da der Zugriff bzw. das raussuchen bestimmter Ergebnisse mittels Indexzugriff auch noch Zeit beanspruchte, habe ich mir überlegt, was ich tun kann um das zu ändern.
Mit `pd.DataFrame` habe ich schöne Optionen und habe damit angefangen. Mein Problem ist, dass das nicht schneller ist.
Ich habe ein Minimalbeispiel geschrieben, die gewünschte Logik müsste darin gut erkennbar sein. Die Berechnung über die Letzten 3 Reihen ist wichtig. Für eine Darstellung im Diagramm benötige ich aber alle Reihen, daher kann ich die vorherigen nicht einfach verwerfen. Ziel ist, dass ich `results` , `mass`, `volume` und `general_results` in einem Objekt habe und dann je nach dem die gewünschten Werte ausgeben kann oder Diagramme erstellen.
Wie macht man so etwas schneller, wenn man die Berechnung selbst nicht ändern kann? Wie und wo speichere ich die Daten sinnvoll und schnell zwischen? In eine Datei schreiben? Bin schon über `h5py` gestolpert. `pandas` hatte für mich den Vorteil mit `groupy` weil ich dann so schön die Berechnung jeder Stufe abfragen kann und keine Schleife benötige. `groupy` sei laut StackOverflow allerdings nicht so schnell. Für mich bin ich jetzt nach sehr vielen Stunden des Code-Uschreibens an einem Punkt, an dem ich sehr dankbar über einen Wegweiser wäre.
Code: Alles auswählen
#!/usr/bin/env python
import dataclasses
import pandas as pd
@dataclasses.dataclass
class State:
volume: float = 0
mass: float = 0
stage: int = 0
def get_important_results(results):
last_rows = results.tail(3)
mass = last_rows.groupby("stage")["mass"].sum()
volume = last_rows.groupby("stage")["volume"].sum()
return mass, volume
def main():
# In reality there are many more values, as shown here
states = [State() for _ in range(3)]
result = pd.DataFrame([dataclasses.asdict(states[0])])
for value in range(10):
for stage, state in enumerate(states, 1):
# Placeholder for calculating
state.stage = stage
state.volume = 300 + value * stage
state.mass = 200 + value * stage
result = pd.concat(
[result, pd.DataFrame([dataclasses.asdict(state)])], ignore_index=True
)
mass, volume = get_important_results(result)
general_results = pd.DataFrame([{"something": 123}])
print(mass)
print(mass[2])
if __name__ == "__main__":
main()
Dennis
Edit: Auch die `dataclass` kann ich rauswerfen/ersetzen, die ist drin, weil sie halt drin war und ich noch nicht weiß ob das Sinn macht oder nicht.
