2014-01-17 3 views
1

파이썬에서 유사한 객체 컬렉션을 만드는 가장 효율적인 방법/데이터 구조는 무엇입니까? 개체 모음을 만드는 가장 효율적인 방법은 무엇입니까?

예 :

내가 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

조기 최적화는 모든 악의 뿌리입니다 :)'timeit' 또는'cProfile' it. 실제로 너무 오래 걸리는 경우 다른 옵션에 대해 생각해보십시오. 목록 이해력은이 경우에는 괜찮아 보입니다. – thefourtheye

+0

그렇습니다. 시간이 얼마나 걸릴지 말해 줄 것입니다. 그러나 더 효율적인 방법이 있는지는 알려주지 않을 것입니다 ... – jramm

+1

기본적인 사실부터 시작합시다 : 파이썬은 효율적이지 않습니다. 정말로 더 많은 힘이 필요하면 다른 언어를 사용하십시오 (C++?). 그러나 여전히 충분히 효율적일 수 있습니다. 더 많은 CPU가 필요하다면 다중 처리를 시도하십시오. 데이터를 처리하는 데 더 많은 메모리가 필요한 경우에도 도움이되지 않습니다. 이 경우 작은 작업으로 작업을 분할하고 하나씩 처리하십시오. '클래스 (Class) '접근법은 오버 헤드 인 것처럼 보입니다 (더 간단합니다, 즉 목록 사용). 다른 곳에서도 사용하려는 경우가 아니라면. – 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

그게 아주 재미 있었어. 고마워하지 않았어. 그러나 Im은 유사 객체 모음이 아닌 숫자 속성에만 관심이 있다고 가정합니다. '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 

지금 당신이 얻을 수/직접 속성 컨테이너에 설정하고 자동 것이다 포함 된 요소로 이러한 요청을 "리디렉션"하여 속성을 추가/제거하려는 경우 컨테이너의 유연성을 향상시킵니다.

관련 문제