在python中处理大量对象的最佳方法

时间:2014-01-30 09:05:21

标签: python

处理同一类的大量实例的最佳方法是什么。目前,我将它们添加到列表中,然后循环遍历列表,如果我需要调用方法。

[o.method() for o in myObjects]

有没有办法将它们作为一个集合处理,因为上面的内容可以被替换为

myObjects.method()

我虽然有一个metaClass而不是包含列表的那个列表并且这样做,但我想知道这是否有点令人费解。有没有一种首选的方法呢?

编辑: 我通常不需要返回值

3 个答案:

答案 0 :(得分:5)

如果要在列表中获得所有这些方法调用的返回值,那么使用map()或列表推导是处理一系列同类对象的正确方法:

from operator import methodcaller
results = map(methodcaller('method'), myObjects)

在Python 3中,map()会返回一个生成器并生成一个列表,它只是使用列表解析最有效:

results = [o.method() for o in myObjects()]

但是,如果您感兴趣的是方法调用本身并且您正在丢弃返回值(例如,因为它是None),那么您现在正在创建一个列表对象。您正在使用列表推导来产生副作用,并在此过程中不必要地生成大量None引用。

在这种情况下,您只需使用简单的for循环:

for o in myObjects:
    o.method()

由于Python的动态特性,在任何情况下,Python都无法知道对象序列是否都具有相同的方法。因为Python的Zen声明显式优于隐式,并且可读性很重要,所以没有“收集调用”。句法;你应该明确地说明这一点。

答案 1 :(得分:0)

但是你编写它,在每个对象上运行method的唯一方法是循环它们(除非你可以重写method并为列表优化它)。例如,如果您有一些名为myObjects.method的类方法或收集方法,那么它内部仍会有一些变体

for o in myObjects:
    o.method()

答案 2 :(得分:0)

您还可以对list进行子类处理以处理此情况:

class customList(list):
    def __getattribute__(self, attr):
        try:
            return super(customList, self).__getattribute__(attr)
        except AttributeError:
            method_list = [getattr(el, attr) for el in self]
            def call_me(*args, **kwargs):
                return [method(*args, **kwargs) for method in method_list]
            return call_me

这是一个测试类:

class Test:
    _instances = customList()

    def __init__(self, arg=0):
        self._instances.append(self)
        self.nb = arg

    def incr(self, arg):
        self.nb += arg

    def get_nb(self):
        return self.nb

    @classmethod
    def get_instances(cls):
        return cls._instances

这就是你得到的:

>>> a = Test(0)
>>> b = Test(1)
>>> c = Test(2)
>>> instances = Test.get_instances()
>>> instances.incr(3)
[None, None, None]
>>> instances.get_nb()
[3, 4, 5]