2017-09-08 3 views
0

schrieb ich ein Python-Code wie folgt (es wird Tabelle unsigned Werte Tabelle von Bytes konvertieren):Python. Wie mache ich meinen Code schneller?

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) 

ich diese Funktion 200-mal pro Sekunde laufen müssen. Wie man es optimiert?

+0

[ 'divmod()'] (https://docs.python.org/3.6/library/functions.html#divmod) könnte etwas helfen. Aber ich habe das Gefühl, dass die Grundlagen fehlerhaft sind. Zuerst sehe ich nicht, warum Sie alle 1024 Berechnungen auf einmal berechnen müssen, und wenn Sie das aus irgendeinem Grund getan haben, sehe ich nicht, warum Sie das mehr als einmal durchgehen müssen (warum nicht zwischenspeichern) ?), geschweige denn 200x/sec. Und selbst wenn Sie mich davon überzeugen könnten, dass * das * notwendig war, scheint die Tabelle "nach oben" durch Multiplizieren und Hinzufügen anstatt Teilen und Subtrahieren schneller zu sein. – jedwards

+0

schade es muss 255 nicht 256 sein ... dividiert durch 256 wäre viel schneller. Es gibt einen möglichen Trick, um 256 zu teilen, dann multiplizieren Sie mit (1 + 1/255), aber mit moderner CPU bezweifle ich, dass Sie einen Unterschied messen würden. –

+1

Eigentlich bin ich nicht sicher, warum es '% 255' ist. Warum willst du nicht den Wert 255 verwenden? Wenn es einen bestimmten Grund gibt, der ein nützlicher Kontext sein könnte. –

Antwort

1

Um schneller, können Sie divmod Funktion:

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

Sie auch eine Funktion aufrufen vermeiden:

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

und eine klassische Iteration verwenden:

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

Ich denke, Sie müssten die Reihenfolge der Indizes ändern. die geraden sammeln das '%'; die ungeraden die '//'. –

+0

@hiroprotagonist: Laut der Dokumentation ist das Ergebnis das gleiche wie '(a // b, a% b)'. Also, ja, ich repariere das. –

0

ein Ein anderer Ansatz besteht darin, die resultierende tab auf einmal mit derzu füllenKonstruktor:

from itertools import chain 

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