[PYTHON] Méthode de conversion efficace en chaîne d'octets

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.

Mise en œuvre jusqu'à présent

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'

Vérification de la vitesse de traitement

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()

résultat

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 ...

Lien de référence

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

Recommended Posts

Méthode de conversion efficace en chaîne d'octets
Conversion entre chaîne hexadécimale et chaîne
Introduction à la méthode Monte Carlo
Convertir une chaîne hexadécimale en binaire
[python] Convertir la date en chaîne