Estoy buscando país por rango de IP para decenas de millones de filas. Estoy buscando una forma más rápida de hacer la búsqueda.¿Cuál es una forma más rápida de buscar un valor en una lista de tuplas?
que tienen 180K tuplas de esta forma:
>>> data = ((0, 16777215, 'ZZ'),
... (1000013824, 1000079359, 'CN'),
... (1000079360, 1000210431, 'JP'),
... (1000210432, 1000341503, 'JP'),
... (1000341504, 1000603647, 'IN'))
(Los números enteros son direcciones IP convertidos en números sin formato.)
Esto hace bien su trabajo, pero sólo se necesita demasiado tiempo:
>>> ip_to_lookup = 999
>>> country_result = [country
... for (from, to, country) in data
... if (ip_to_lookup >= from) and
... (ip_to_lookup <= to)][0]
>>> print country_result
ZZ
¿Alguien puede indicarme la dirección correcta para una forma más rápida de hacer esta búsqueda? Usando el método anterior, 100 búsquedas toman 3 segundos. Es decir, creo que las filas de 10M demorarán varios días.
Primera obvia micro-optimización: 'country_result = próxima (únicamente para partir, a, país en datos si ip_to_lookup> = desde y ip_to_lookup <= a)' – agf
Segundo: ordenar los 'data' lo que sólo necesita para probar el límite inferior: tan pronto como lo hayas cruzado, estás en el rango correcto. – agf
'from' es una palabra clave y no se puede usar como nombre de variable. –