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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Werner (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von Werner (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.