Voici le code que je souhaitais rendre plus rapide :
# Replace pixels values: BGR to RGB
pixels_len = len(pixels)
for idx in range(0, pixels_len - 2, 3):
pixels[idx + 2], pixels[idx] = pixels[idx], pixels[idx + 2]
Il s'agit d'une partie du module Python MSS qui s'occupe de récupérer les pixels d'un écran sous Windows.
pixels
est un array contenant les données brutes de type c_char BGR (bleu, vert, rouge) et pixels_len
vaut plusieurs millions suivant la configuration des écrans. Le but de la manœuvre est d'inverser la place du B et du R afin d'avoir les valeurs RGB (rouge, vert, bleu) de chaque pixel.
La consommation mémoire important peu tant que le temps d'exécution est raccourci, une élégante solution qui utilise les slices me fût proposée :
pixels = bytearray(pixels)
pixels[2::3], pixels[0::3] = pixels[0::3], pixels[2::3]
pixels = bytes(pixels)
Grâce à ce procédé, le temps d'exécution a été divisé par un 50, voire plus dans certains cas. Génial !
Pour plus d'explications : les slices, c’est rapide et c’est beau.
Pouvez-vous faire mieux ?
Si vous souhaitez essayer une solutions plus efficace, je serai ravi d'avoir des retours. Je mets à disposition des fichiers de test afin que vous puissiez manipuler les données en situation réelle :
- test-raw-windows.py, que vous pouvez exécuter depuis n'importe quel OS, le nom est trompeur.
- data-windows.raw, les données brutes.
Usage :
$ python2 test-raw-windows.py
$ python3 test-raw-windows.py
Historique
- 2017-01-26 : simplification du
slice
. - 2015-04-25 : code 10x plus rapide grâce à yoch d'IndexError.
- 2015-04-20 : ajout des fichiers de test.