Python Skript schneller machen?
Hey!
Um es zu beschreiben:
Es ist ein Skript, dass die ganze Zeit eine Api abruft ob es neue Dinge gibt, obwohl es eigentlich nicht die perfekte Sprache dafür ist, habe ich trotzdem Python benutzt, da ich Python "gut" kann.
Das Problem ist aber: In diesem Fall müsste ich einer der ersten Personen sein, die sobald sich etwas ändert, es als erstes bekommt, nur da es in Python ist, bin ich meistens nicht einer der ersten.
Gibt es Tipps, wie ich es vielleicht ein wenig beschleunigen kann? Auch wenn es in Python ist?
Was wäre die perfekte Programmiersprache für sowas um es so schnell wie möglich zu bekommen?
Ich habe z.B. gehört, dass man das Skript auf einen Server packen könnte und es einem ein paar Millisekunden Vorteil geben könnte, als wenn ich es auf meinem PC laufen lasse? Falls es jemand braucht: Ich habe eine 1 GBit Leitung
Was vielleicht auch noch hilfreich zu wissen ist, ist das die Server der API in Amerika stehen, dass ist schonmal ein Nachteil
2 Antworten
Gibt es Tipps, wie ich es vielleicht ein wenig beschleunigen kann? Auch wenn es in Python ist?
- Miete dir einen Server, der in Amerika steht und hoste auf diesem dein Programm. Das würde allerdings nur dafür sorgen, dass dein Programm schneller an die Informationen kommt, nicht du.
- Verringere den Timeout, um im Fehlerfall keine Zeit zu verlieren.
- Schau, wie du den Response am schnellsten verwerten kannst. Wenn es sich bspw. um ein JSON-Format handelt, könnte eine Verarbeitung via Regex schneller sein, als den kompletten Response zu parsen. Sollte es notwendig sein, Informationen zu speichern, könnte es womöglich sinnvoll sein, dies nur in bestimmten Zeitintervallen durchzuführen und für die Zeit dazwischen ein anderes Ausgabemedium (wie die Konsole) zu wählen.
- Schau dir concurrent.futures an. Aktionen können asynchron / parallel ausgeführt werden.
- Wenn du die Möglichkeit hast, die API via HTTP aufzurufen (statt HTTPS), könntest du dir den Security Handshake sparen.
- Generell macht es Sinn, sich auch einmal die Client-Implementation anzuschauen. Solltest du eine Bibliothek verwenden (grequests, httpx, requests, urllib3, ...), gibt es zu dieser womöglich bessere Optionen. Eine Recherche sollte helfen.
- Recherchiere, wie viele API Requests pro Minute erlaubt sind. Stell sicher, das es kein Cooldown gibt, andernfalls gilt es diesen mit zu behandeln.
Was wäre die perfekte Programmiersprache für sowas um es so schnell wie möglich zu bekommen?
Eine Programmiersprache, die folgende Funktionalitäten bietet (sei es über Module der Standardbibliothek oder 3rd-Party-Software):
- Parallelität oder Threading
- Sockets sowie Implementationen für verschiedene Protokolle (wie HTTP/S)
- Eine schnelle Verarbeitung von Zeichenketten
Der wesentlichen Teil der Kommunikation liegt in der Strecke, die die Nachricht hin- und zurücklegen muss. Da ist es egal, ob du den Request nun via C, C++, Rust oder Fortan abschickst.
Eine größere Einflussmöglichkeit liegt bei der Datenvorbereitung und dem Lesen der Daten. Vielleicht macht eine HTTP-Kompression Sinn (Beispielimplementation). Ob die API dies auch auf ihrer Seite unterstützt, müsstest du nachschauen / testen. Auf Clientseite hast du dafür jedenfalls genügend Zeit (2 min), Beim Lesen wiederum kannst du schneller sein, indem du den Raw Response selbst liest oder statt requests die urllib3-Bibliothek verwendest.
Hinsichtlich Stringverarbeitungen ist Python schon gut aufgestellt. Wenn du unbedingt nach etwas anderem suchst, schau dir Golang an.
Nein, wie gesagt kommst du selbst so nicht schneller an die Informationen. Es würde sich hingegen lohnen, wenn die Daten direkt weiterverarbeitet werden sollen oder die eingelesene Information nur für die ersten n-Anfragen gültig ist. Beispiel: Seite A liefert Gutscheincodes, die von deinem Programm angefordert und dann bei Seite B eingelöst werden.
Wenn du eine API Request machst, hängt die Geschwindigkeit eher mit deinem Internet zusammen.
Ob du Geografisch näher am Server bist, Welche leitungen und Welchen ISP du hast etc.
Solltest du allerdings mehrere requests machen könnte dir Asyncio oder Threading/Multiprocessing helfen.
Wenn ich aber diese Daten dann noch auswerten lasse von Python, was z.B. niedriger ist als sonst, dann dauert das länger, auch wenn es nur ms sind, da haben andere dann einen Vorteil
Auf Seite https://towardsdatascience.com/how-fast-is-c-compared-to-python-978f18f474c7 liest man:
It means Python takes 25 times more time to run the same algorithm compared to C++.
Clearly, C++ is much faster than Python in running the same algorithm and instructions. It is not a surprise to most programmers and data scientists, but the example shows that the difference is significant.
Lies auch: qu : Wie sich Python mit C vergleicht
In Python geschriebener Code arbeitet um mindestens eine Größenordnung langsamer als in C geschriebener (genauer: um einen Faktor, der — je nach Aufgabe des Programms — irgendwo zwische 20 und 200 liegt).
Ich benutze das Modul Requests. Die API kann maximal 120 mal pro Minute abgefragt werden, aber aktualisiert sich ca alle 60 sekunden, dann parse ich die JSON und ich lasse es dann in der Konsole ausgeben.
Regex wäre vielleicht wirklich eine Lösung um es etwas zu beschleunigen.
Wäre sowas wie CPP einer der besten Sprachen dafür? Ich habe mal gehört, dass jemand Rust für schnelle API Requests benutzt, nur ich weiß nicht, ob Rust da viel schneller als Python ist