Как можно быстрее найти значение в списке кортежей?

Я ищу страну по диапазону IP-адресов для десятков миллионов строк. Я ищу более быстрый способ поиска.

У меня есть 180 000 кортежей в этой форме:

>>> data = ((0, 16777215, 'ZZ'),
...         (1000013824, 1000079359, 'CN'),
...         (1000079360, 1000210431, 'JP'),
...         (1000210432, 1000341503, 'JP'),
...         (1000341504, 1000603647, 'IN'))

(Целые числа — это IP-адреса, преобразованные в простые числа.)

Это работает правильно, но занимает слишком много времени:

>>> 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

Может ли кто-нибудь указать мне правильное направление для более быстрого способа выполнения этого поиска? метод выше, 100 запросов занимают 3 секунды. Это означает, что я думаю, что 10 миллионов строк займут несколько дней.

8
задан Charles Duffy 17 March 2012 в 21:04
поделиться