¿Los pandas mucho más lentos que los adormecidos?

El siguiente código sugiere que los pandas pueden ser mucho más lentos que los adormecidos, al menos en el caso específico del clip de función (). Lo sorprendente es que hacer un viaje de ida y vuelta de pandas a numpy y de nuevo a pandas, mientras se realizan los cálculos en numpy, es mucho más rápido que hacerlo en pandas.

¿No debería haberse implementado la función de pandas de esta manera indirecta?

In [49]: arr = np.random.randn(1000, 1000) In [50]: df=pd.DataFrame(arr) In [51]: %timeit np.clip(arr, 0, None) 100 loops, best of 3: 8.18 ms per loop In [52]: %timeit df.clip_lower(0) 1 loops, best of 3: 344 ms per loop In [53]: %timeit pd.DataFrame(np.clip(df.values, 0, None)) 100 loops, best of 3: 8.4 ms per loop 

En master / 0.13 (versión muy breve), esto es mucho más rápido (aún un poco más lento que el número nativo debido al manejo de la alineación / dtype / nans).

En 0.12 se aplicaba por columna, por lo que esta era una operación relativamente costosa.

 In [4]: arr = np.random.randn(1000, 1000) In [5]: df=pd.DataFrame(arr) In [6]: %timeit np.clip(arr, 0, None) 100 loops, best of 3: 6.62 ms per loop In [7]: %timeit df.clip_lower(0) 100 loops, best of 3: 12.9 ms per loop