laden von Werten aus binären Dateien schneller machen

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.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Mein Programm sieht jetzt so aus,
http://pastebin.com/m3a93fd00

Die extrahieren Methode funktioniert jetzt auch. Auf zur nächsten. :-)
Zuletzt geändert von feldmaus am Donnerstag 28. Mai 2009, 18:31, insgesamt 1-mal geändert.
BlackJack

Wo Du gerade das Wort "Methode" verwendest: Das ist eigentlich gar keine, oder habe ich irgendwo eine Verwendung von `self` übersehen!? Das sieht nach einer Funktion aus. Warum ist die an eine Klasse gebunden?
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:Wo Du gerade das Wort "Methode" verwendest: Das ist eigentlich gar keine, oder habe ich irgendwo eine Verwendung von `self` übersehen!? Das sieht nach einer Funktion aus. Warum ist die an eine Klasse gebunden?
Mr. Zufall war am Werk. :-)

also man könnte mal drüber nachdenken die Funktion auszulagern, ist
aber erstmal für die Performance nicht so wichtig.

Und schon kommt meine nächste Methode,
http://pastebin.com/m712a67ef

Mein Rechner geht dabei gut bis 100%. Diese Methode soll die alle Daten
als Gnuplot Tabelle speichern.
Sieht einer von Euch da ne Chance ein wenig mehr Performance
raußzuholen?

self.daten ist ein numpy array der wie folgt aufgebaut ist:

Code: Alles auswählen

[[np.array mit Zeitstempel],[3 np.arrays mit den Peaks ],
[3 np.arrays mit den Peak Werten]]
Grüße Markus
BlackJack

@feldmann_markus: Naja, so besonders toll ist die vorherige Funkion aber immer noch nicht. Der Name ist "Denglisch" und nicht PEP8-Konform. Es gibt eine handvoll Zeilen, die länger als 80 Zeichen sind. Er könnte eine Tüte Leerzeichen nach Kommata vertragen um lesbarer zu werden. Zeichenketten werden als Kommentare missbraucht.

Es wird zuviel in dieser einen Funktion getan. Laden, verarbeiten, speichern -- alles in einer Funktion. Nicht voneinander abgekoppelt, so dass man zum Beispiel nicht einfach Tests für die einzelnen Aspekte schreiben kann. Zuviele Namen, wie wir ja schon gestgestellt haben. Wenn man nicht mehr sieht, dass nicht alle Argumente verwendet werden, dann ist das ein Warnzeichen, dass die Funktion zu unübersichtlich geworden ist. `starttime` und `endtime` werden nirgends benutzt.

----

Zur nächsten Funktion: OMG. Du solltest Dir echt mehr Gedanken darüber machen was jeder einzelne Schritt tut und welche Zwischenergebnisse da rauskommen. Und endlich mit dieser ekligen Indexerei aufhören. Lauter unnötige Namen und Verschachtelte Zugriffe bei denen man nicht mehr durchsteigt.

Nochmal: Zeichenketten sind keine Kommentare, ausser wenn sie das erste in einem Modul, nach einer ``def``- oder ``class``-Zeile sind. An anderen Stellen sind sie nur toter Ballast im Code.

Diese Zeichenketten-Additionen sind "teuer" weil bei jeder Addition eine neue Zeichenkette entsteht, die in die die Bytes der beiden alten kopiert werden. Es werden also Unmengen an temporären Zeichenketten erzeugt und wieder weggeworfen.

Ausserdem werden für jede Zeile drei unnötige Arrays mit den Indexen erzeugt.

Und das `np.real()` ist auch unglaublich. Hast Du mal ausprobiert was das aus Skalaren macht? Das erzeugt ein `np.array` der Länge 1 mit dem Wert darin. Warum machst Du das!?

Mal ungetestet beide Methoden als Funktionen: http://paste.pocoo.org/show/119616/
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Naja, so besonders toll ist die vorherige Funkion aber immer noch nicht.
Stimmt, aber mir war halt die performance wichtig. Die Übersichtlichkeit
kommt mit der Zeit. Nur habe ich für dieses Projekt nicht unendlich viel
Zeit.
Ich schreibe noch an einem anderen Python Programm(privat), da
kann ich mich dann richtig austoben. :-)
BlackJack hat geschrieben:`starttime` und `endtime` werden nirgends benutzt.
Geändert.


BlackJack hat geschrieben:Nochmal: Zeichenketten sind keine Kommentare, ausser wenn sie das erste in einem Modul, nach einer ``def``- oder ``class``-Zeile sind. An anderen Stellen sind sie nur toter Ballast im Code.
Ich werde mir das logging Modul noch mal angucken, aber nicht mehr
für dieses Programm.
BlackJack hat geschrieben:Diese Zeichenketten-Additionen sind "teuer" weil bei jeder Addition eine neue Zeichenkette entsteht, die in die die Bytes der beiden alten kopiert werden. Es werden also Unmengen an temporären Zeichenketten erzeugt und wieder weggeworfen.
Ich brauche für Gnuplot Leerzeichen zwischen den Daten.
BlackJack hat geschrieben:Ausserdem werden für jede Zeile drei unnötige Arrays mit den Indexen erzeugt.
Ich werde das wie Du mit der map() Funktion machen.
BlackJack hat geschrieben:Und das `np.real()` ist auch unglaublich. Hast Du mal ausprobiert was das aus Skalaren macht? Das erzeugt ein `np.array` der Länge 1 mit dem Wert darin. Warum machst Du das!?
Weil die Ausgabe sonst komisch aus sah, hier mal eine Ausgabe mit real()
und imag():
8.45053534704e-07 1 1 1 -1.0 -4.79459260937e-17j 0.5 -0.866025388241j 0.5 0.866025388241j
3.38021413882e-06 1 1 1 -3.00149301233e-17 -1.0j 0.866025388241 0.5j -0.866025388241 0.5j
0.00013436350855 1 1 1 -1.0 3.65565637658e-25j 0.5 -0.866025388241j 0.5 0.866025388241j
Ich gucke mir mal dein Programm an, sieht ja schon mal scharf aus. :-)
Die with Funktion kennt mein System, mein Buch und die Python Doku
2.6.2 nicht.
BlackJack hat geschrieben:Mal ungetestet beide Methoden als Funktionen: http://paste.pocoo.org/show/119616/
Danke das Du Dir die Mühe gemacht hast. :-)
Wie gesagt ich habe keine Zeit mehr, normalerweise müsste ich das
Programm Heute Abend fertig haben. :-)
Ich werde morgen und Heute noch ein ein paar Sachen ändern ergänzen.
BlackJack

@feldmann_markus: Für Leerzeichen zwischen Zeichenketten braucht man nicht zwingend ``+``. Wenn man die als Liste oder allgemein als "iterable" vorliegen hat, ist die `str.join()`-Methode in der Regel wesentlich effizienter.

Was heisst die Ausgabe sah "komisch" aus? Das macht bei `np.float32`- und `np.byte`-Objekten bei der Umwandlung in Zeichenketten keinen sichtbaren Unterschied. Es erzeugt bloss unnötige Objekte. Selbst bei `np.complex64`-Objekten ist es nicht die erste Wahl, weil auch da ein *Array* mit der jeweiligen Komponente als einzigem Element erzeugt wird. Wenn Du den Real- und Imaginärteil *einer* komplexen Zahl benötigst, dann gibt's dafür Attribute auf dem Objekt selbst.

Code: Alles auswählen

In [310]: c = np.complex64(4.5+2.5j)

In [311]: c
Out[311]: (4.5+2.5j)

In [312]: np.real(c)
Out[312]: array(4.5, dtype=float32)

In [313]: np.imag(c)
Out[313]: array(2.5, dtype=float32)

In [314]: c.real
Out[314]: 4.5

In [315]: c.imag
Out[315]: 2.5
Die ``with``-Anweisung gibt es seit Python 2.5 und die ist auch in der Dokumentation vorhanden. Im Tutorial am Ende des Abschnitts über Methoden auf Datei-Objekten und in der Sprachreferenz unter dem Titel The ``with`` statement.
Antworten