2016-11-09 2 views
0

ich den folgenden Code haben, die für eine lange Zeit läuft:Python: verfolgen Sie den Prozentsatz des Auftrags verarbeitet

my_df['result'] = my_df.apply(lambda x: my_fun(x), axis = 1) 

my_df ist ein Datenrahmen Pandas und ich habe Millionen von Zeilen. Gibt es eine Möglichkeit herauszufinden, wie viel Prozent des Jobs bereits erledigt sind? z.B. eine Print-Anweisung in my_fun oder irgendwo einfügen? Vielen Dank!

Antwort

0

Es sei denn, Sie etwas zu tun, dass Ihr Prozess von sys.stdout (seltenem, aber plausibel) oder sys.stderr (deutlich seltener, aber immer noch technisch nicht unmöglich) trennen würde, Ihre Idee nur eine print-Anweisung in my_fun setzen sollte gut funktionieren.

Natürlich werden Sie nicht in der Lage sein, das zu tun Fortschritt Mitte Ausdruck in my_fun loggt sein, wie wenn my_fun einige other_fun aufruft, die eine sehr lange Zeit in Anspruch nimmt. In diesem Fall müssten Sie den Ausdruck in other_fun setzen. Wenn Sie beispielsweise für jede Zeile einzeln etwas tun, können Sie einen Ausdruck irgendwo in die entsprechende Schleife einfügen und sagen, wie viele Zeilen relativ einfach ausgefüllt wurden. Zählen Sie einfach, und drucken Sie die Nummer (möglicherweise sys.stderr oder ein Logger, anstelle von sys.stdout, wenn Sie sys.stdout für etwas anderes verwenden) jedes Mal, wenn es ein Vielfaches von, sagen wir, 1000 (oder 10.000 oder 100.000 - a Nummer, die für Ihre Verwendung funktioniert). Drucken Sie nicht jede Zeile - sie wird zu schnell verwischen, um tatsächlich zu lesen, wenn eine einzelne Zeile schnell verarbeitet wird und Sie am Ende möglicherweise genug Zeit für das Drucken aufwenden, wodurch die Verarbeitung erheblich verlangsamt wird.

Wenn Sie nur eine einzige Operation ausführen, die alle Daten ohne Schleife berücksichtigen muss, können Sie weiterhin Fortschrittsberichte innerhalb der Funktion erstellen, aber es gibt keine echte Möglichkeit, eine "Anzahl von Zeilen" zu erhalten abgeschlossen "Statistik und es wird wahrscheinlich schwieriger sein, einen genauen Prozentsatz zu erhalten.

+0

können Sie ein Beispiel zum Drucken des Prozentsatzes des Fortschritts in my_fun() angeben? Da es von Lambda aufgerufen wird, weiß ich nicht, wie es den gesamten Job-Fortschritt verfolgt ... – Edamame

+0

Nicht genauer gesagt, was 'my_fun' eigentlich ist. Fügen Sie einfach eine Druckanweisung an dem Punkt in der Funktion ein, an dem sie etwas drucken soll. Vielleicht geben Sie der Funktion ein Attribut, mit dem Sie rechnen können, um nicht bei jeder Wiederholung zu drucken. –

Verwandte Themen