3

从 Python 中的大列表中剔除项目的最有效方法(就内存和 cpu 而言)是什么?这是一个好方法吗?

a = range(0,100000)
a[:] = [item for item in a if item > 10]

这里的数字只是一个例子。也可以是:

a = ["my", "very", "big", "list"]
a[:] = [item for item in a if item.startswith("b")]
4

3 回答 3

1

Python 有专门为此目的构建的生成器函数。请参阅此处的文档。除了使用range(文档建议使用xrangewhich 返回生成器)之外,您的实现非常好。

文档有以下示例:

# Build and return a list
def firstn(n):
    num, nums = 0, []
    while num < n:
        nums.append(num)
        num += 1
    return nums

sum_of_first_n = sum(firstn(1000000))

这会浪费很多空间。所以文档建议做这样的事情:

# Using the generator pattern (an iterable)
class firstn(object):
    def __init__(self, n):
        self.n = n
        self.num, self.nums = 0, []

    def __iter__(self):
        return self

    def next(self):
        if self.num < self.n:
            cur, self.num = self.num, self.num+1
            return cur
        else:
            raise StopIteration()

sum_of_first_n = sum(firstn(1000000))
于 2013-05-29T20:25:10.443 回答
1

如果你真的想要一个列表(并且你想替换你的原始列表),你可能不会比纯 python 做得更好。但是,这通常不是必需的。通常,您只需要一个可迭代的对象:

generator = (item for item in a if item > 10)
for item in generator:
    ...

这将提高内存效率,并且性能应该大致相同。

于 2013-05-29T20:26:33.693 回答
0

您可以使用filtergenerators在这里

发电机

>>> data = [10, 20, 4, 4, 11, 13.4]
>>> custom_filter = (i for i in data if i > 10)
>>> [j for j in custom_filter]
[20, 11, 13.4]
>>>

筛选

>>> data = [10, 20, 4, 4, 11, 13.4]
>>> custom_filter = filter(lambda x: x > 10, data)
>>> custom_filter
[20, 11, 13.4]
>>> 
于 2013-05-29T20:32:33.400 回答