代码之家  ›  专栏  ›  技术社区  ›  Thanatos

Python语句使用了过多的RAM

  •  2
  • Thanatos  · 技术社区  · 14 年前

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

    …吃掉了我的大部分公羊。(>150兆字节!)为什么?

    编辑: zip 返回一个列表,而不是iterable。像这样的 返回一个iterable?


    更重要的是:我在两个大的文件数据数组上迭代,我正在做迭代(0-end,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 回复  |  直到 14 年前
        1
  •  12
  •   nos    14 年前

    使用 izip 来自itertools

        2
  •  3
  •   kindall    14 年前

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

    (看着 the documentation ,我明白了,除了他们在用 map 而不是列出理解。)