2016-05-25 4 views
0

Ich habe viele Situationen, in denen Berechnungen begegnen Dinge wie:wie teuer sind RuntimeWarning Warnungen auf die Leistung für die Berechnung auf großen Daten

-divide by zero 
-np.nan values in a column that I compute df['col'].quantile(0.5) 
-np.nan values in groupby objects that are then used like grouped.agg('sum') 

etc

ich keine Fehler erhalten, aber tun RuntimeWarning Meldungen. Jetzt, da meine Daten sehr groß sind, frage ich mich, ob diese Warnungen zu Leistungseinbußen führen und wenn ja, kann ich sie umgehen.

Beispiel:

lib/python2.7/site-packages/pandas/core/ops.py:87: RuntimeWarning: divide by zero encountered in true_divide 
    rtruediv=arith_method(lambda x, y: operator.truediv(y, x), 

lib/python2.7/site-packages/pandas/core/ops.py:720: RuntimeWarning: invalid value encountered in greater_equal 

lib/python2.7/site-packages/numpy/lib/function_base.py:3403: RuntimeWarning: Invalid value encountered in median 
    RuntimeWarning) 

lib/python2.7/site-packages/numpy/lib/function_base.py:3386: RuntimeWarning: invalid value encountered in multiply 
    x2 = take(ap, indices_above, axis=axis) * weights_above 
+0

Fragen Sie sich, ob der * Warnmechanismus * teuer ist, oder wundern Sie sich über * das, worüber Sie die Warnung warnt *? – user2357112

+0

der Warnmechanismus. Ich weiß, warum ich die Warnung bekomme, d. H. Dividiere durch 0, Datenelement = inf oder np.nan. – codingknob

Antwort

1

Eine Warnung beträgt mehrere einfache Operationen, einschließlich Hashing, um zu bestimmen, ob eine Warnung bereits ausgestellt wurde und ob diese Warnung sollte mehr als einmal ausgegeben werden, und wo die Warnung aufgetreten ist. Diese sind schnell, aber sie sind nicht frei.

Alle treten diese Vorgänge unabhängig davon, ob eine Warnung tatsächlich gedruckt wird, und dies ist unabhängig von den Kosten für die Heuristik verwendet, um zu bestimmen, ob die Bibliothek die Abmahnung sollte Sie warnen, dass etwas nicht ganz richtig ist.

Hier ist eine Aufschlüsselung des Preises von nur warning.warn Aufruf

In [4]: %timeit [warnings.warn("Hey You") for i in range(1000)] 
ipython-script.py:257: UserWarning: Hey You # Notice this only was printed once 
1000 loops, best of 3: 1.2 ms per loop 

In [6]: %timeit [i + i for i in range(1000)] 
10000 loops, best of 3: 53.4 µs per loop 

So 1 Millisekunde für 1000 Warnfunktionen. Skaliere das bis zu der Anzahl der Warnungen, die du ausführst * wie oft diese Operationen ausgeführt werden, und du wirst eine Vorstellung davon haben, wie viel Zeit es kostet.

Werden diese Warnungen einige Rechenminuten für einen rechenzeitlichen Job kosten? Ja. Aber wird die Antwort in einem Tag und fünf Minuten schlimmer sein als die Antwort an einem Tag? Wahrscheinlich nicht.

+0

Vielen Dank für die Illustration. Ich schätze es. Also, gibt es nicht sowieso Warnungen selbst intern zu deaktivieren? – codingknob

+0

@codingknob: Während Sie einen Warnungsfilter installieren können, um Warnungen zu deaktivieren, wird es nicht wirklich billiger als der Standard sein. – user2357112

+0

Korrigieren. Selbst wenn Sie die Warnmaschinerie deaktivieren, weil diese Maschinerie so feinkörnig wie möglich konstruiert ist, kann sie nicht wissen, dass sie keine Warnung erzeugen sollte, bis sie die Art der Warnung herausgefunden hat, woher diese Warnung stammt (im Quellcode) und ob diese Warnung bereits ausgegeben wurde. – mobiusklein

Verwandte Themen