2017-12-17 6 views
0

은 내가 만들려고 해요 고전 Point 구조체의 동등한 있습니다.파이썬에서 메모리 효율적인 구조체 표현을 더 많이?

from collections import namedtuple 
Point = namedtuple('Point', ['x', 'y']) 

그러나 나는 단지 namedtuples의 추가 오버 헤드 (예 : 길이, 인덱스 액세스, __contains__ 등) (속성 이름으로 액세스)과 없음 또한, 내 유스 케이스는 고정 된 한 종류의 제한된 기능이 필요합니다 Point.xPoint.y을 위해 어쩌면 정적 타이핑 보증에 의존하는 또 다른 해킹이있다.

는 더 적은 메모리 오버 헤드 뭔가가 있나요? 아마도 ctypes 또는 Cython 솔루션일까요?

+0

사용자 정의 클래스와'__slots__'? namedtuple의 기능은 https://github.com/python/cpython/blob/3.6/Lib/collections/__init__.py#L310에서 확인할 수 있습니다. – jonrsharpe

+0

@jonrsharpe'namedtuple' 인스턴스는'__slots__' 옵션을 가지고 있습니다. –

+0

@EliKorvigo 네,뿐만 아니라 영업 이익은 (그들이 당 인스턴스 존재하지 않는 "오버 헤드"의 방법으로 많이 아니에요 있지만) 그들이 원하지 않는 말한다 잔뜩. 어쨌든 그것을 보여줄 링크를 추가했습니다. – jonrsharpe

답변

2

내가 생각하는 사이 썬 확장을 생성하는 것은 메모리에 미치는 영향을 줄일 수있는 가장 쉬운 방법이 될 것입니다. Cython 확장 유형의 속성은 객체의 C 구조체에 직접 저장되며 속성 집합은 컴파일시 고정됩니다 (Python의 __slots__과 비슷 함).

cdef class Point: 

    cdef readonly double x, y # C-level attributes 

    def __init__(self, double x, double y): 
     self.x = x 
     self.y = y 

    def __repr__(self): 
     return 'Point({}, {})'.format(self.x, self.y) 
관련 문제