Der schnellste Weg, um eine Liste von Fließkommazahlen in Python in Bytes zu packen
Habe ich eine Liste von sagen wir 100k schwimmt und ich möchten, konvertieren Sie ihn in einen Byte-buffer.
buf = bytes()
for val in floatList:
buf += struct.pack('f', val)
return buf
Dies ist ziemlich langsam. Wie kann ich es machen schneller nur mit standard-Python 3.x-Bibliotheken.
InformationsquelleAutor der Frage That Umbrella Guy | 2012-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur sagen
struct
wie vielefloat
s, die Sie haben. 100k schwimmt dauert etwa eine 1/100stel einer Sekunde auf meinen langsamen laptop.InformationsquelleAutor der Antwort agf
Können Sie ctypes, und ein double-array (oder float-array) genau so, als würden Sie in C , anstatt zu halten Sie Ihre Daten in einer Liste. Dies ist eine faire niedrigen Niveau, ist aber eine Empfehlung, wenn Sie brauchen, große Leistung, und wenn Ihre Liste ist eine Feste Größe.
Können Sie erstellen, die den Gegenwert einer C
double array[100];
in Python by doing:
Den
ctypes.c_double * 100
Ausdruck ergibt eine Python-Klasse für ein array von Double, 100 Elemente lang. Auf Draht es zu einer Datei, können Sie einfachbuffer
zu seiner Inhalt:Wenn Ihre Daten bereits in einer Python-Liste, packen es in ein double array kann oder kann nicht schneller sein als der Aufruf
struct
als Agf die akzeptierten Antworten - ich lass Messen, die ist schneller als Hausaufgabe, aber alle der code, den Sie brauchen, ist diese:Sehen es als einen string, nur:
str(buffer(array))
- der einzige Nachteil hier ist, dass Sie haben zu kümmern, Schwimmer Größe (float vs double) und CPU-abhängig Typ "float" - das struct-Modul können übernehmen diese Arbeit für Sie.Den großen Gewinn ist, dass Sie mit einem float-array-können Sie immer noch die Elemente als zahlen, die durch den Zugriff auf dann, gerade als ob es wo einen einfachen Python-Liste, während mit dann bereitwillig zur Verfügung, als ein planar-Speicher region mit
buffer
.InformationsquelleAutor der Antwort jsbueno
Als mit strings, mit
.join()
schneller sein wird als kontinuierlich zu verketten. Eg:Ergebnisse in:
InformationsquelleAutor der Antwort Gareth Latty
Funktionieren sollte:
InformationsquelleAutor der Antwort katzenversteher
Array von single-precision-float gibt es zwei Möglichkeiten: die Verwendung
struct
oderarray
.So
struct
ist schneller.InformationsquelleAutor der Antwort Sklavit
Meisten der Langsamkeit wird sein, dass Sie immer wieder Anhängen ein bytestring. Kopiert den bytestring jeder Zeit. Verwenden Sie stattdessen
b''.join()
:InformationsquelleAutor der Antwort craigds
Wie Sie sagen, dass Sie wirklich tun wollen single-precision - 'f' schwebt, möchten Sie vielleicht, um zu versuchen, die array-Modul (in der standard-Bibliothek seit dem 1.x).
Dies kann sparen Sie eine Tasche-laden des Speichers, während immer noch eine variable-Länge-container, mit die meisten von der Liste Methoden. Das array.array-Ansatz nimmt 4 Byte pro single-precision-float. Die Liste Ansatz verbraucht einen Zeiger auf ein Python-float-Objekt (4 oder 8 Byte) plus der Größe des Objekts; auf einem 32-bit-CPython-Implementierung, 16:
Insgesamt: 20 Byte pro Element im besten Fall für eine
list
4 bytes pro Element, immer für einearray.array('f')
.InformationsquelleAutor der Antwort John Machin