2017-09-08 2 views
0

j'ai écrit un code python comme celui-ci (il convertit le tableau des valeurs non signées à la table des octets):Python. Comment rendre mon code plus rapide?

def foo(in_value, index) 
    TabOut[index*2] = in_value%255 
    TabOut[index*2+1] = in_value//255 



for i in range(0,1024): 
    foo(tabIn[i],i) 

Je dois exécuter cette fonction 200 fois par seconde. Comment l'optimiser?

+0

[ 'divmod()'] (https://docs.python.org/3.6/library/functions.html#divmod) pourrait aider un peu. Mais j'ai l'impression que les fondamentaux sont imparfaits. Premièrement, je ne vois pas pourquoi vous auriez besoin de calculer tous les 1024 calculs à la fois, et si pour une raison ou une autre, je ne vois pas pourquoi vous auriez besoin de le faire plus d'une fois (pourquoi ne pas le mettre en cache? ?), encore moins 200x/sec. Et même si vous pouviez me convaincre que * cela * était nécessaire, construire la table "en haut" en multipliant et en ajoutant au lieu de diviser et de soustraire semble plus rapide. – jedwards

+0

honte il doit être 255 pas 256 ... diviser par 256 serait beaucoup plus rapide. Il y a un truc potentiel à diviser par 256 puis multiplier par (1 + 1/255) mais avec un CPU moderne, je doute que vous puissiez mesurer une différence. –

+1

En fait je ne sais pas pourquoi c'est '% 255'. Pourquoi ne voulez-vous pas utiliser la valeur 255? S'il y a une raison spécifique qui pourrait être un contexte utile. –

Répondre

1

Pour aller plus vite, vous pouvez utiliser la fonction divmod:

TabOut[index * 2 + 1], TabOut[index * 2] = divmod(value, 255) 

Vous pouvez également éviter d'appeler une fonction:

for i in range(1024): 
    TabOut[index * 2 + 1], TabOut[index * 2] = divmod(tabIn[i], 255) 

Et utiliser une itération classique:

for index, value in enumerate(tabIn): 
    TabOut[index * 2 + 1], TabOut[index * 2] = divmod(value, 255) 
+0

Je pense que vous auriez besoin de revenir sur l'ordre des indices. les pairs recueillent le '%'; les impairs le '//'. –

+0

@hiroprotagonist: Selon la documentation, le résultat est le même que '(a // b, a% b)'. Donc, oui, je répare ça. –

0

une approche différente est de remplir le résultat tab en une seule fois en utilisant le list constructeur:

from itertools import chain 

tab = list(chain.from_iterable((b, a) 
      for a, b in (divmod(value, 255) for value in tab_in)))