[PYTHON] Effiziente Konvertierungsmethode in Byte-String

Der Prozess der Konvertierung von Listendaten für die serielle Kommunikation mit Pyserial in eine Byte-Zeichenfolge Ich hatte das Gefühl, dass es spät war, und notierte mir die Ergebnisse meiner Untersuchung.

Implementierung bisher

Es ist eine einfache Sache, dass ich nur eine Byte-Zeichenfolge erstellen möchte, ohne an etwas Besonderes zu denken.

    data = [ _ for _ in xrange(0, 10) ]
    byte_str = "".join([chr(x) for x in send_list])
    # byte_str => '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t'

Überprüfung der Verarbeitungsgeschwindigkeit

Als ich nach einer anderen Implementierungsmethode suchte, wurde diese im Stapelüberlaufartikel im Referenzlink geschrieben Ich beschloss, den Prozess zu testen. Die Version von Python ist 2 Serien.

import time
import array
import struct

def main():
    #Messmethode
    def measure_time(data, func):
        post = time.time()
        for _ in xrange(1000000):
            func(data)
        t = time.time() - post
        return t

    #Konvertierungsmethode für Byte-Zeichenfolgen(Das Verarbeitungsergebnis ist für alle Muster gleich)
    bytearray_pattern = lambda x : str(bytearray(x))            #Muster 1
    array_pattern = lambda x : array.array(b'B', x).tostring()  #Muster 2
    struct_pattern = lambda x : struct.pack(b'B' * len(x), *x)  #Muster 3
    join_pattern = lambda x : "".join([chr(_) for _ in x])      #Muster 4(Verarbeitung bisher)

    #Testlistendaten
    small_data = [ _ for _ in xrange(0,10) ]    # len=10
    huge_data = [ _ for _ in xrange(0,256) ]    # len=256

    #Hauptverarbeitung
    proc_time = measure_time(small_data, bytearray_pattern) # proc_time:1.18099999428
    proc_time = measure_time(small_data, array_pattern)     # proc_time:0.874000072479
    proc_time = measure_time(small_data, struct_pattern)    # proc_time:0.784999847412
    proc_time = measure_time(small_data, join_pattern)      # proc_time:1.72000002861
    proc_time = measure_time(huge_data, bytearray_pattern)  # proc_time:5.57999992371
    proc_time = measure_time(huge_data, array_pattern)      # proc_time:11.3169999123
    proc_time = measure_time(huge_data, struct_pattern)     # proc_time:11.0810000896
    proc_time = measure_time(huge_data, join_pattern)       # proc_time:32.9349999428

main()

Ergebnis

Wenn Sie viele Daten senden müssen, ist es besser, Muster 1 "str (bytearray (list)" zu verwenden. Wenn die Anzahl der Daten gering ist, scheinen Muster 2 und Muster 3 möglicherweise schneller zu sein. (Es sieht aus wie ein Fehler)

Was ich vorerst mit Sicherheit sagen kann, ist, dass es kein Muster 4 gibt ... (Reflexion)

Referenzlink

http://stackoverflow.com/questions/3470398/list-of-integers-into-string-byte-array-python

Recommended Posts

Effiziente Konvertierungsmethode in Byte-String
Konvertierung zwischen hexadezimaler Zeichenfolge und Zeichenfolge
Einführung in die Monte-Carlo-Methode
Konvertieren Sie eine hexadezimale Zeichenfolge in eine Binärzeichenfolge
[Python] Datum in Zeichenfolge konvertieren