Ist pypng 16-Bit-PNG-Kodierung mit pypy auf dem Raspberry Pi schneller?

English Deutsch

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.

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:

is_pypng_benchmark.py
#!/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")

Check out similar posts by category: Python, Raspberry Pi