Ist pypng 16-Bit-PNG-Kodierung mit pypy auf dem Raspberry Pi schneller?
In unserem vorherigen Beitrag How to save Raspberry Pi raw 10-bit image as 16-bit PNG using pypng haben wir untersucht, wie man die pypng-Bibliothek verwendet, um 10-Bit-Raw-Raspberry-Pi-Kamerabilder als 16-Bit-PNG-Dateien zu speichern.
Das Speichern eines einzelnen Bildes dauerte jedoch ~26 Sekunden mit CPython 3.7.3. Da pypy Beschleunigungen für viele Python-Workloads bieten kann, haben wir versucht, pypy3 7.0.0 (siehe How to install pypy3 on the Raspberry Pi) zu verwenden, um die PNG-Kodierung zu beschleunigen.
Ergebnisse
pypng-PNG-Export scheint einer der Workloads zu sein, die mit pypy3 viel langsamer sind.
- CPython 3.7.3:
Encoding took 24.22 seconds pypy37.0.0:Encoding took 266.60 seconds
Die Kodierung ist mehr als 10x langsamer bei Verwendung von pypy3!
Daher empfehle ich nicht, pypy3 zu verwenden, um pypng-Kodierungs-Workloads zu beschleunigen, zumindest nicht auf dem Raspberry Pi!
Vollständiges Beispiel
Dieses Beispiel ist von unserem vollständigen Beispiel abgeleitet, das zuvor unter How to save Raspberry Pi raw 10-bit image as 16-bit PNG using pypng veröffentlicht wurde:
#!/usr/bin/env python3
import time
import picamera
import picamera.array
import numpy as np
import png
# Bild erfassen
print("Capturing image...")
with picamera.PiCamera() as camera:
with picamera.array.PiBayerArray(camera) as stream:
camera.capture(stream, 'jpeg', bayer=True)
# Daten demosaicing und in rawimg schreiben
# (stream.array enthält die nicht-demosaiced-Daten)
rawimg = stream.demosaic()
# In PNG schreiben
print("Writing 16-bit PNG...")
t0 = time.time()
with open('16bit.png', 'wb') as outfile:
writer = png.Writer(width=rawimg.shape[1], height=rawimg.shape[0], bitdepth=16, greyscale=False)
# rawimg ist ein (w, h, 3) RGB uint16-Array
# aber PyPNG benötigt ein (w, h*3) Array
png_data = np.reshape(rawimg, (-1, rawimg.shape[1]*3))
# 10-Bit-Daten auf 16-Bit-Werte skalieren (sonst erscheint es schwarz)
# HINWEIS: Je nach Foto und Einstellungen
# kann es immer noch recht dunkel erscheinen!
png_data *= int(2**6)
writer.write(outfile, png_data)
t1 = time.time()
print(f"Encoding took {(t1 - t0):.2f} seconds")