with read_sql read inner index column python performance indexing pandas binary-search

python - read_sql - pandas union dataframe



¿Cuál es el impacto en el rendimiento de índices no únicos en pandas? (1)

De la documentación de los pandas, he deducido que los índices con valores únicos hacen que ciertas operaciones sean eficientes, y que los índices no únicos se toleran ocasionalmente.

Desde el exterior, no parece que los índices no únicos se aprovechen de ninguna manera. Por ejemplo, la siguiente consulta ix es lo suficientemente lenta como para que parezca que está escaneando todo el dataframe

In [23]: import numpy as np In [24]: import pandas as pd In [25]: x = np.random.randint(0, 10**7, 10**7) In [26]: df1 = pd.DataFrame({''x'':x}) In [27]: df2 = df1.set_index(''x'', drop=False) In [28]: %timeit df2.ix[0] 1 loops, best of 3: 402 ms per loop In [29]: %timeit df1.ix[0] 10000 loops, best of 3: 123 us per loop

(Me doy cuenta de que las dos consultas ix no devuelven lo mismo; es solo un ejemplo de que las llamadas a ix en un índice no exclusivo parecen mucho más lentas)

¿Hay alguna manera de convencer a los pandas para que utilicen métodos de búsqueda más rápidos, como la búsqueda binaria en índices no únicos y / o clasificados?


Cuando el índice es único, los pandas usan una tabla hash para asignar la clave al valor O (1). Cuando el índice no es único y está ordenado, los pandas usan la búsqueda binaria O (logN), cuando el índice se ordena al azar, los pandas deben verificar todas las claves en el índice O (N).

Puede llamar sort_index método sort_index :

import numpy as np import pandas as pd x = np.random.randint(0, 200, 10**6) df1 = pd.DataFrame({''x'':x}) df2 = df1.set_index(''x'', drop=False) df3 = df2.sort_index() %timeit df1.loc[100] %timeit df2.loc[100] %timeit df3.loc[100]

resultado:

10000 loops, best of 3: 71.2 µs per loop 10 loops, best of 3: 38.9 ms per loop 10000 loops, best of 3: 134 µs per loop