2014-01-17 32 views
1

在python中创建类似对象集合的最有效的方法/数据结构是什么?创建对象集合的最有效方法?

实施例:

假设我有一个数Point()实例。每个实例都有一个x属性。

我想将它们组合一起,以执行批量操作等

我可能只是把他们都在一个列表:

points = [Point(x=1), Point(4), Point(7)... Point(1)] 

我可以创建一个类,只是需要这个列表作为输入:

Class PointCollection(): 

    def __init__(self, points): 
     """ points is a list of Point() instances """ 
     self.points = points 

为了访问所有的x属性,类可能有一个看起来像这样的方法:

@property 
def allX(self): 
    return [pnt.x for pnt in self.points] 

我的问题是,有没有更好的方法?我可以想象,对于有大量点的集合来说,具有需要循环访问的属性可能需要一些时间来计算。在更复杂的集合中,您可能有许多属性,或者更深层的嵌套属性(集合集合?)。

是否有更好的数据结构来实现?或者更好地转向使用Cython和/或多处理来获得更多性能?



编辑:

这里是关于我的具体问题,更详细一点:

这涉及到一些GIS数据结构 - 即其描述支流类。这些集合将描述一个河流网络,并且我将考虑访问像整个网络的属性(如每个支流的x坐标或'里程')来执行批量操作。

但是,我想创建一个非常普遍的“集合”结构的'最佳'方法,这就是我使用Point()示例的原因。我可以看到这是在其他方面我的工作很有用...

+1

Prematured优化是所有邪恶的根源:)'timeit'或'cProfile'它。如果真的花费太长时间,那么考虑其他选项。在这种情况下,列表理解看起来没问题。 – thefourtheye

+0

好的,timeit会告诉我需要多长时间。但它不会告诉我是否有更高效的方法... – jramm

+1

让我们从基本事实开始:Python效率不高。如果你真的需要更多的权力,使用一些其他语言(C++?)。但它仍然可能足够高效。如果你需要更多的CPU,然后尝试多处理。如果你需要更多的内存来处理数据,它不会对你有所帮助。在这种情况下,将任务分解为更小的任务并逐个处理它们。 “类”方法似乎是一种开销(简单更好,即使用列表)。除非你打算在其他地方使用它。 – freakish

回答

3

如果您主要从事数字数据,可考虑使用与NumPy及其recarray

>>> import numpy 
>>> a = numpy.array([(1.0, 2.0), (7.3, -1.0), (4.2, 3.7)], 
        dtype=[("x", float), ("y", float)]) 
>>> b = a.view(numpy.recarray) 
>>> b.x 
array([ 1. , 7.3, 4.2]) 
>>> b[0] 
(1.0, 2.0) 

与NumPy提供阵列相当有效的向量化操作数据。

+0

这很有趣,我没有想到它,谢谢。但是,它假定我只对一些数字属性感兴趣,而不是对象的集合。使用'Point()'就是一个例子。我希望它成为一组类实例的更一般的容器。 – jramm

1

这个答案不涉及性能问题,但你一定可以在更广泛的方式来处理这样一个集合:

Class PointCollection: 
    def __getattr__(self, name): 
     return [point.__getattr__(name) for point in self.points] 

    def __setattr__(self, name, values): 
     for (point, value) in zip(self.points, values): 
      point.__setattr__(name, value) 

    def __init__(self, points): 
     """ points is a list of Point() instances """ 
     self.points = points 

现在你可以获取/设置直接在容器上的任何属性,它会自动将这些请求“重定向”到包含的元素,使得您的容器在您想添加/删除属性的情况下更加灵活。

相关问题