Python - "xor" jedes Byte in "Bytes" auf die effizienteste Art und Weise

8

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:

  1. Gibt es einen effizienteren Weg (CPU-Wize)?
  2. Gibt es einen "saubereren" Weg, dies zu tun (ohne die Leistung zu beeinträchtigen)?

P.S. Wenn es von Bedeutung ist, verwende ich Python 3.5

    
Gil Barash 03.10.2017, 08:32
quelle

2 Antworten

3

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.

    
PM 2Ring 03.10.2017, 09:18
quelle
2

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

    
Fabio Veronese 03.10.2017 11:15
quelle

Tags und Links