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.
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'
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()
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)
http://stackoverflow.com/questions/3470398/list-of-integers-into-string-byte-array-python