Python оператор использует чрезмерное количество оперативной памяти - PullRequest
2 голосов
/ 31 октября 2010

Это простое утверждение:

zip(xrange(0, 11614321), xrange(0, 11627964))

... съедает большую часть моей оперативной памяти.(> 150 МиБ!) Почему?

Редактировать: Ах, перечитывая документы, я вижу, zip возвращает список, а не повторяемый.Что-нибудь вроде zip, которое возвращает итеративное значение?


Изображение большего размера: я перебираю два больших массива файловых данных и делаю такие вещи, как перебора (0-конец, 0-end), (0-end, 1-end) и т. д. Я бы не хотел разрезать массив, так как это вызвало бы чрезмерное выделение памяти.Я подумал, что вместо этого просто переберу индексы, но, похоже, это не сработает, как указано выше.Весь код:

def subsequence_length(data_a, data_b, loc_a, loc_b):
    length = 0
    for i_a, i_b in zip(xrange(loc_a, len(data_a)), xrange(loc_b, len(data_b))):
        if data_a[i_a] == data_b[i_b]:
            length += 1
        else:
            break
    return length

Ответы [ 2 ]

12 голосов
/ 31 октября 2010

Использование izip от itertools

3 голосов
/ 31 октября 2010

Если по какой-то причине вы не хотите использовать модуль itertools, было бы тривиально написать свой собственный итератор, который делал бы то же самое, по крайней мере, если вы знаете, что имеете дело именно с двумя входными итераторами.

def xzip2(i1, i2):
    i1, i2 = iter(i1), iter(i2)
    while True:
        yield next(i1), next(i2)

На самом деле, при дальнейшем размышлении не так сложно заставить его работать с любым количеством итераторов. Я уверен, что itertools.izip должно быть реализовано примерно так.

def xzip(*iters):
    iters = [iter(i) for i in iters]
    while True:
        yield tuple([next(i) for i in iters])

(И, глядя на документацию , я вижу, что это так, за исключением того, что они используют map, а не списки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...