2013-04-13 4 views
1

Как я (эффективно) прохожу через огромные диапазоны в Python? Всякий раз, когда я пытаюсь запустить что-то вроде:Цитирование через огромные диапазоны в python

for x in range(105, 10000000000000): 
    #do stuff 

Требуется целая вечность. Я пробовал много вещей, таких как iter, set, xrange, но до сих пор нет успеха. Есть ли какой-нибудь внешний модуль, который может мне помочь?

+0

вам, возможно, придется использовать py3x здесь, так как '' xrange() 'и' range() 'не будут работать для' 10000000000000'. –

+0

Ну, вы действительно итерации на огромном диапазоне, и делая даже миниатюрную работу, каждая итерация займет некоторое время. Что вы делаете внутри цикла, который требует повторения много раз? –

+0

related: ['xrange (2 ** 100)' -> OverflowError: long int too large для преобразования в int] (http://stackoverflow.com/questions/1482480/xrange2100-overflowerror-long-int-too-large -to-convert-to-int) – jfs

ответ

4

Учитывая диапазон, я думаю, можно с уверенностью сказать, что почти независимо от того, что вы делаете или как вы это делаете, это займет некоторое время.

Чтобы быть более конкретным, вы выполняете приблизительно 1E + 13 итераций вашего цикла. С достойным кодом и разумным быстрым процессором вы можете выполнять около 4E + 9 инструкций в секунду (например, 2 инструкции на такт с частотой 2 ГГц). Это явно не точно, но на данный момент давайте просто поедем с ним и посмотрим, где мы закончим.

Таким образом, даже если предположить, что каждая итерация цикла требует выполнения только одной однотактной команды, она будет принимать приблизительно: 1E + 13/4E + 9 = 2,5E3 секунды = ~ 42 минуты. Учитывая, что вы выполняете некоторую работу внутри цикла, и есть некоторые накладные расходы для самого цикла, мы, очевидно, будем выполнять более одной инструкции машинного кода на итерацию. Если нам нужно выполнить, скажем, 1000 инструкций на итерацию (может быть разумным в первом приближении, учитывая, что вы ничего не сказали нам о том, что вы делаете), тогда мы смотрим на что-то вроде 600-700 часов для цикл для выполнения.

Подводная черта: изменение способа представления вашего диапазона может помочь, но если вам нужно перебирать диапазон в этом большом, то не уйти от того, что это займет некоторое время.

2

Предполагая, что у вас есть процессор 3GHz, и вам нужен всего один цикл для каждой записи в диапазоне, вам потребуется ~ 3,333 секунды (~ 1 час) для его обработки.

Это заставляет меня думать, что есть что-то принципиально неправильное в том, что вы делаете. Может быть, вы должны перестроить свою проблему.

Смежные вопросы