Geschwindigkeit struct.unpack

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
bowie_22
User
Beiträge: 7
Registriert: Mittwoch 28. Oktober 2009, 07:14

Hallo Zusammen,

ich schreibe gerade einen Parser für ein bestimmtes Binärfileformat und verwende zum "übersetzen" der Rohdaten struct.unpack.

Das funktioniert auch ganz gut.
Mein Problem: Die Dateien sind relativ groß und ich sitze dann schon mal eine Minute bis die Datei gelesen ist.

Ich habe meinen Code auch schon optimiert (zu Beginn waren es noch 2 Minuten).
Jetzt bin ich an einem Punkt angelangt, an dem der Profiler mir anzeigt: "Mache was an den struct.unpack Aufrufen."

Hier meine Schleife in der ich die Zeit liegen lasse:

Code: Alles auswählen

for i_record in range(1,number_of_records):
               start_index=i_record*size_of_DATARECORD+offset_in_record
               stop_index=start_index+signal_byte_length
               raw_data=raw_data_datablock[start_index:stop_index]    
               int_data=struct.unpack(fmt,raw_data)[0]
               int_data_vec[i_record]=int_data

Meine Frage:
Macht es Sinn das Auspacken in C oder C++ zu implementieren? Wird man da schneller?
Gibt es eine Alternative zu struct.unpack die schneller arbeitet, weil vielleicht weniger Overhead.
Denn eigentlich muss ich nur eine Anzahl von Bytes in integer und float Werte entpacken.

Hat da jemand Erfahrung?
Was ich bräuchte wäre halt sowas wie struct.unpack bloss schneller.

Gruß Marcus
deets

ich bezweifele, dass du grosse Gewinne einfahren kannst - denn es kostet nunmal eine bestimmte Zeit, einen primitiven Datentyp zu einem PyObject zu konvertieren.

Aber struck.unpack zerfaellt ja in 2 Teile: dem parsieren des format-strings, und dem einlesen der eigentlichen Daten. Da dein format-string sich nicht aendert, kannst du ein bisschen optimieren, indem du

Code: Alles auswählen

import struct
s = struct.Struct(fmt)
for i_record ... :
    ...
    int_data = s.unpack(raw_data)
machst. Ob das viel bringt - kannst ja mal berichten.
BlackJack

@bowie_22: Wie sehen die Daten denn aus? Du entpackst in der Schleife da jetzt nicht so etwas wie ein `int`-Array in dem Du für jeden einzelnen Wert diesen ganzen Code ablaufen lässt, oder!?

Vielleicht können wir besser helfen wenn Du uns nicht einen Ausschnitt zum optimieren zeigst, sondern das ganze Problem — ohne eine (Teil)Lösung. Denn man muss schon die Rahmenbedingungen kennen um mehr sagen zu können als das es neben `struct` auch noch „slicing”, `array`, `ctypes`, oder `numpy` gibt.
Antworten