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 :

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.