2017-12-17 8 views
0

私は、作成しようとしている古典的なPoint構造体に相当するものを持っています。Pythonでのメモリ効率のよい構造体表現ですか?

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

はしかし、私はnamedtuplesの余分なオーバーヘッド(例えば長さ、インデックスアクセス、__contains__など)の(属性名によるアクセス)とどれもまた、私のユースケースにも固定しているタイプの限られた機能が必要になりますPoint.xPoint.yの場合は、静的なタイピングの保証に依存するハッキングがあります。

さらにメモリオーバーヘッドのあるものはありますか?おそらく​​またはCythonのソリューションですか?

+0

'__slots__'のカスタムクラスですか? namedtupleの動作を確認することができます:https://github.com/python/cpython/blob/3.6/Lib/collections/__init__.py#L310。 – jonrsharpe

+0

@jonrsharpe 'namedtuple'インスタンスには' __slots__'が付属しています。 –

+0

@EliKorvigoはい、しかし、OPは彼らが望んでいないと言っているものもたくさんあります(インスタンスごとに存在しないので、「オーバーヘッド」の方法ではあまりありませんが)。とにかくそれを示すためのリンクを追加しました。 – jonrsharpe

答えて

2

おそらく、Cython拡張を作成すると、メモリへの影響を最小限に抑えることができます。 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) 
関連する問題