37 Stimmen

Wie man in Python eine Liste von Floats in eine Binärdatei ausgibt

Ich habe eine Liste von Fließkommawerten in Python:

floats = [3.14, 2.7, 0.0, -1.0, 1.1]

Ich möchte diese Werte in eine Binärdatei mit IEEE 32-Bit-Kodierung schreiben. Wie lässt sich das in Python am besten bewerkstelligen? Meine Liste enthält etwa 200 MB an Daten, also wäre etwas "nicht zu langsames" am besten.

Da es 5 Werte gibt, möchte ich nur eine 20-Byte-Datei als Ausgabe.

49voto

Nadia Alramli Punkte 105256

Alex hat völlig recht, es ist effizienter, es so zu machen:

from array import array
output_file = open('file', 'wb')
float_array = array('d', [3.14, 2.7, 0.0, -1.0, 1.1])
float_array.tofile(output_file)
output_file.close()

Und dann lesen Sie das Feld so:

input_file = open('file', 'rb')
float_array = array('d')
float_array.fromstring(input_file.read())

array.array Objekte haben auch eine .fromfile Methode, die zum Lesen der Datei verwendet werden kann, wenn die Anzahl der Elemente im Voraus bekannt ist (z. B. anhand der Dateigröße oder eines anderen Mechanismus)

25voto

thesamet Punkte 6192

ご覧ください。 Pythons struct-Modul

import struct
s = struct.pack('f'*len(floats), *floats)
f = open('file','wb')
f.write(s)
f.close()

14voto

Alex Martelli Punkte 805329

Das Array-Modul in der Standardbibliothek könnte für diese Aufgabe besser geeignet sein als das struct-Modul, das alle vorschlagen. Die Leistung bei 200 MB Daten sollte im Wesentlichen besser mit Array.

Wenn Sie eine Reihe von Optionen ausprobieren möchten, können Sie Ihr System mit etwas wie dies

11voto

Grant Punkte 2708

Ich bin nicht sicher, wie NumPy Leistung für Ihre Anwendung vergleichen, aber es kann sich lohnen, das zu untersuchen.

使用方法 NumPy :

from numpy import array
a = array(floats,'float32')
output_file = open('file', 'wb')
a.tofile(output_file)
output_file.close()

führt ebenfalls zu einer 20-Byte-Datei.

6voto

dino Punkte 2813

Ich bin auf ein ähnliches Problem gestoßen, als ich versehentlich eine 100+ GB große csv-Datei geschrieben habe. Die Antworten hier waren äußerst hilfreich, aber um der Sache auf den Grund zu gehen, Ich habe alle genannten Lösungen profiliert und noch einige mehr . Alle Profiling-Läufe wurden auf einem 2014 Macbook Pro mit einer SSD mit Python 2.7 durchgeführt. Von dem, was ich sehe, ist die struct ist aus Sicht der Leistung definitiv der schnellste Ansatz:

6.465 seconds print_approach    print list of floats
4.621 seconds csv_approach      write csv file
4.819 seconds csvgz_approach    compress csv output using gzip
0.374 seconds array_approach    array.array.tofile
0.238 seconds numpy_approach    numpy.array.tofile
0.178 seconds struct_approach   struct.pack method

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X