Le processus de conversion des données de liste pour la communication série avec pyserial en une chaîne d'octets J'ai senti qu'il était tard, j'ai donc pris note des résultats de mon enquête.
C'est une chose simple que je veux juste créer une chaîne d'octets sans penser à rien en particulier.
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'
Lorsque je cherchais une autre méthode d'implémentation, cela a été écrit dans l'article de débordement de pile dans le lien de référence J'ai décidé de tester le processus. La version de python est 2 séries.
import time
import array
import struct
def main():
#Méthode de mesure
def measure_time(data, func):
post = time.time()
for _ in xrange(1000000):
func(data)
t = time.time() - post
return t
#Méthode de conversion de chaîne d'octets(Le résultat du traitement est le même pour tous les modèles)
bytearray_pattern = lambda x : str(bytearray(x)) #modèle 1
array_pattern = lambda x : array.array(b'B', x).tostring() #Motif 2
struct_pattern = lambda x : struct.pack(b'B' * len(x), *x) #Modèle 3
join_pattern = lambda x : "".join([chr(_) for _ in x]) #Motif 4(Traitement jusqu'à présent)
#Données de la liste de test
small_data = [ _ for _ in xrange(0,10) ] # len=10
huge_data = [ _ for _ in xrange(0,256) ] # len=256
#Traitement principal
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()
Si vous avez beaucoup de données à envoyer, il semble préférable d'utiliser le modèle 1 str (bytearray (list)
.
De plus, lorsque le nombre de données est petit, il semble que le modèle 2 et le modèle 3 soient plus rapides. (Cela ressemble à une erreur)
Pour l'instant, ce que je peux dire avec certitude, c'est qu'il n'y a pas de modèle 4 ...
http://stackoverflow.com/questions/3470398/list-of-integers-into-string-byte-array-python