Ich habe ein "Bytes" -Objekt und eine "int" -Maske, ich möchte ein Xor über alle Bytes mit meiner Maske machen. Ich mache diese Aktion wiederholt über große "Bytes" -Objekte (~ 4096 KB).
Dies ist der Code, den ich habe, der die Arbeit gut macht, nur es ist sehr CPU-intensiv und verlangsamt mein Skript:
%Vor%Das Beste, was ich mir vorstellen kann, ist das etwa 20-mal schnellere:
%Vor%Meine Fragen sind:
P.S. Wenn es von Bedeutung ist, verwende ich Python 3.5
Ich glaube nicht, dass Sie viel schneller als Ihr Algorithmus mit reinem Python kommen können. (Aber die Antwort von Fabio Veronese zeigt, dass das nicht stimmt). Sie können sich ein wenig Zeit sparen, indem Sie das Listenverständnis nachvollziehen, aber dann muss diese Liste wieder in ein Array konvertiert werden, und das Array muss in Bytes konvertiert werden, so dass es mehr RAM für einen vernachlässigbaren Nutzen benötigt .
Allerdings können Sie viel schneller machen, indem Sie Numpy verwenden. Hier ist eine kurze Demo.
%Vor%typische Ausgabe
%Vor%Getestet mit Python 3.6.0 auf einem alten Single-Core-32-Bit-2-GHz-Rechner, der unter Linux läuft.
Ich habe gerade einen Lauf mit datasize = 4000000
gemacht und do_mask_numpy
hat 0,0422 Sekunden gebraucht.
Eine Alternative, falls Sie nicht numpy verwenden möchten. Der Vorteil besteht darin, einen einzigen Vergleich durchzuführen und die Maskengröße auf die benötigte Größe zu erweitern (abhängig von der Datengröße).
%Vor%Ergebnisse sind wie folgt:
%Vor%Macht immer noch Punkte, um schneller zu sein, aber vielleicht möchte man es nicht in die Produktionsumgebung einbeziehen.
:] Am besten
Tags und Links python performance