Programm ultra langsam

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Speedy
User
Beiträge: 11
Registriert: Mittwoch 4. September 2019, 11:29

Hi,

ich habe Daten in einer bzw mehreren Ecxel Dateien. Eine Spalte enthält das Datum (D) zusammen mit der Uhrzeit. Da ich ausrechnen möchte, wieviele Stunden seit Beginn vergangen sind, möchte ich die Zeiten voneinander subtrahieren. Soweit ganz gut. Es funktioniert (habe es testweise an 2 Datwn ausprobiert.) Da ich allerdings ca 980000 Daten habe (Excel ist ca 2 GB groß), warte ich seit +30 min. Wie kann ich die Rechnung beschleunigen?

Code: Alles auswählen

......
import datetime
from datetime import timedelta
datetimeFormat = "%Y-%m-%d %H:%M:%S"

# converting absolute times into hours
time_arr3 = np.empty([0,1])
for i in range(len(abs_t_3)):
#    #diff = abs_t_3[i].to_pydatetime() - abs_t_3[0].to_pydatetime() ### ist seehr langsam
    diff = pd.Timestamp(abs_t_3[i]) - pd.Timestamp(abs_t_3[0])  ### auch sehr langsam...hatte keine Geduld mehr abzuwarten
    time_h = (diff.days * 24 ) + diff.seconds / 3600
    time_arr3 = np.insert(time_arr3, len(time_arr3), time_h)
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Speedy: Du machst da ja auch sehr komische Sachen. Ein `np.insert()` das bei genauer Betrachtung ein `np.append()` ist. Aber auch das ist falsch weil Du da jedes Element einzeln hinzufügst, da ein Array aber in seinen Dimensionen unveränderlich ist, kopierst Du bei jedem mal das bisher vorhandene Ergebnis im Speichern herum. Bei 980000 64-Bit-Gleitkommawerten sind das fast 3½ *Terabytes* die da unsinnig im Speicher herumgeschaufelt werden. Kein Wunder dass das lange dauert.

Die Schleife in Python ist schon der falsche Ansatz wenn man Numpy oder Python verwendet. Das Datum + Zeit sollte beim einlesen als Pandas-DataFrame bereits in ein entsprechendes Format umgewandelt werden. Und dann einfach den Zeitstempel vom ersten Datensatz von der Spalte abziehen um `timedelta`-Objekte zu bekommen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Speedy
User
Beiträge: 11
Registriert: Mittwoch 4. September 2019, 11:29

. Ein `np.insert()` das bei genauer Betrachtung ein `np.append()` ist
Am Anfang hatte iche iniges probiert, aber irgendwie habe ich es nicht hinbekommen.
Habe das Problem jetzt gelöst, es ist nicht sehr elegant, aber ich habe sehr schnell eine Lösung gebraucht (bin selber noch Anfänger in Python und alles was ich lerne durch probieren und Internet). Alle 3 sekunden wurden Daten aufgenommen und eine Spalte enthält die Indizes für alle Zeilen. D.h. ich habe einfach geschaut, welche Zeile welchen Index hat und mit 3 multipliziert (vorher index-1).
Die Schleife in Python ist schon der falsche Ansatz wenn man Numpy oder Python verwendet. Das Datum + Zeit sollte beim einlesen als Pandas-DataFrame bereits in ein entsprechendes Format umgewandelt werden. Und dann einfach den Zeitstempel vom ersten Datensatz von der Spalte abziehen um `timedelta`-Objekte zu bekommen.
Aber dieser Ansatz klingt sehr interessant, ich werde es augjedenfall versuchen. Eine andere Idee, die ich hatte war, eine SQL Datenbank zu erstellen und so die Berechnungen durchzuführen. So wie ich bereits informiert bin, gehen Rechnungen über Datenbankanken sehr viel schneller, aber habe noch nie damit gearbeitet.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bist falsch informiert. Berechnungen gehen in Datenbanken nicht aus Prinzip schneller. Die sind gut im suchen und finden, und haben noch ein paar andere positive Eigenschaften. Aber über jede Zeile eines Datensatzes zu rennen ist eher noch langsamer als in numpy oder Pandas. Wenn man letztere richtig nutzt.
Antworten