Python (urllib) Windows 8.1: Bild holen dauert zu lange

Gast #6514605
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
...
Gast #6514874
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.
Gast #6523164
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.
Gast #6527468
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.
Gast #6527721
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.