Forum: PC-Programmierung Python (urllib) Windows 8.1: Bild holen dauert zu lange


von Werner (Gast)


Lesenswert?

Wer kennt sich mit Python 3.7 und der "urllib" aus?

Der Schnipsel zwischen den Punkten dauert ca. 5,2 s. Messe ich die Zeit 
in der Firefox-Konsole dauert das Holen des Bildes 130 ms.

Wie kann ich den Vorgang (Python) beschleunigen?
1
import urllib.request, base64, time
2
...
3
with urllib.request.urlopen(url) as response:
4
    imageB = Image.open(BytesIO(response.read()))
5
...

von blubb (Gast)


Lesenswert?

Mal getested ob es einen Uunterschied gibt ob es eine lokale URL ohne 
Verschlüsselung ist oder nicht?

von Werner (Gast)


Lesenswert?

blubb schrieb:

> Mal getested ob es einen Uunterschied gibt ob es eine lokale URL ohne
> Verschlüsselung ist oder nicht?

Werde ich testen.

Es ist ein Bild von einer lokalen WLAN-Kamera (Foscam-Klon, 10 Jahre 
alt).

von Heiner (Gast)


Lesenswert?

Werner schrieb:
> Der Schnipsel zwischen den Punkten dauert ca. 5,2 s. Messe ich die Zeit
> in der Firefox-Konsole dauert das Holen des Bildes 130 ms.

Mit solchen Vergleichen muss man vorsichtig sein, denn bei Firefox 
könnte Caching im Spiel sein. Wenn man nicht zwingend im Browser messen 
muss, ist curl besser für Benchmarks geeignet.

Wie auch immer, wenn hier tatsächlich Python "schuld" ist, hätte ich 
eher BytesIO im Verdacht. Damit gab es immer wieder 
Performance-Probleme, u.a. wegen der Art, wie es die Daten intern hält. 
Daher würde ich folgende Maßnahmen vorschlagen:

1. Das BytesIO-Objekt mit close() manuell schließen. Das könnte etwas 
bringen, wenn der Schnipsel oben mehrfach ausgeführt wird.

2. Auf das aktuellere Python 3.9 nachziehen. Die meisten der o.g. 
Probleme sind zwar seit 3.5 gelöst, aber man weiß es nicht ...

3. Wenn externe Abhängigkeiten kein Problem sind: Mal die 
requests-Bibliothek statt urllib ausprobieren.

von Jim M. (turboj)


Lesenswert?

Heiner schrieb:
> Mit solchen Vergleichen muss man vorsichtig sein, denn bei Firefox
> könnte Caching im Spiel sein

Firefox kann insbesondere auch pipelining, d.h. er nutzt für neue HTTP 
Anfragen dieselbe TCP Verbindung. Dann fällt alles weg was Zeit kostet: 
DNS, 3-Wege-Handshake, SSL (bei https).

von Werner (Gast)


Lesenswert?

@ Heiner

Vielen Dank für deine Tipps.

Die Zeit wird letztendlich in dieser Anweisung 'vergeudet':
1
...
2
response = urllib.request.urlopen(request)
3
...

Das BytesIO-Objek mit close() schließen und die Installation der 
Python-Version 3.9 brachten keinen Zeitvorteil.

Erst der Test mit einer zweiten Kamera (Trenddata) brachte eine spürbare 
Verbesserung von 5,2 s auf 1,0 s. Die lange Antwortzeit liegt also 
entweder an der Foscam-Kamera oder an den Kommunikationsparametern 
Foscam-Kamera/Python-Script.

Am Wochenende werde ich noch die request-library ausprobieren.

von Imonbln (Gast)


Lesenswert?

Werner schrieb:
> Erst der Test mit einer zweiten Kamera (Trenddata) brachte eine spürbare
> Verbesserung von 5,2 s auf 1,0 s. Die lange Antwortzeit liegt also
> entweder an der Foscam-Kamera oder an den Kommunikationsparametern
> Foscam-Kamera/Python-Script.

Hast du mal einen Wireshark mitlaufen lassen? um zu sehen, wer wann wie 
schnell Fragt/Antwortet?
Vielleicht hilft es auch einen mitmproxy zwischen dein Script und der 
Webcam zu hängen, ist zwar auch in Python geschrieben, aber die 
Kommunikation zu beobachten ist immer erfolgreicher als wildes Raten wo 
der Hase im Pfeffer liegt.

Werner schrieb:
> Am Wochenende werde ich noch die request-library ausprobieren.

Dir ist schon klar, dass die request-library intern auch nur urllib 
benutzt?

Last but not least,
wie ist denn das verhalten, wenn du die Webcam URL mit curl aufrufst? 
Vielleicht kannst Du auch unter Firefox mal dein User-Agent-Header faken 
um zu sehen, ob das vielleicht einen Einfluss hat, wie die Webcam 
antwortet. Viele Webserver haben Browser Weichen.

von Werner (Gast)


Lesenswert?

Der Vollständigkeit halber: die Python-Library request hat es 
gebracht.
Die Zeiten pro Aufruf sind auf 170 ms geschrumpft.

> Dir ist schon klar, dass die request-library intern auch nur urllib
> benutzt?

Nein. Das hat mich jetzt überrascht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.