私はテーブルを作成するために次のクラスを使用していますが、より高速にするだけでなく、それとのやりとりを高速化する方法を見つける必要があります:Pythonリスト操作の高速化とカスタムテーブルクラスの比較
class Table(object):
"""a three dimensional table object"""
def __init__(self, xsize=1, ysize=1, zsize=1):
self.xsize = xsize
self.ysize = ysize
self.zsize = zsize
self.data = [0] * (xsize * ysize * zsize)
def __getitem__(self, key):
x, y, z = self.__extractIndices(key)
return self.data[x + self.xsize * (y + self.ysize * z)]
def __setitem__(self, key, value):
x, y, z = self.__extractIndices(key)
self.data[x + self.xsize * (y + self.ysize * z)] = value
def __extractIndices(self, key):
x = y = z = 0
if (self.ysize > 1):
if (self.zsize > 1):
if len(key) != 3:
raise IndexError
else:
x, y, z = key
elif len(key) != 2:
raise IndexError
else:
x, y = key
elif not isinstance(key, int):
raise IndexError
else:
x = key
return (x, y, z)
def resize(self, xsize=1, ysize=1, zsize=1):
"""resize the table preserving data"""
oldlist = list(self.data)
self.data = [0] * (xsize * ysize * zsize)
self.xsize = xsize
self.ysize = ysize
self.zsize = zsize
for i in range(0, oldlist):
self.data[1] = oldlist[i]
オンポイント2つのリストのデータがそれぞれzの と同等であるかどうかを調べる必要があります。
for x in range(self.map.width - 1):
for y in range(self.map.height - 1):
tempflag = False
#layer 1
if self.data[x, y, 0] != self.map.data[x, y, 0]:
tempflag = True
layer1flag = True
#layer 2
if self.data[x, y, 1] != self.map.data[x, y, 1]:
tempflag = True
layer2flag = True
#layer 3
if self.data[x, y, 2] != self.map.data[x, y, 2]:
tempflag = True
layer3flag = True
#copy the data if it changed
if tempflag:
self.data = copy.deepcopy(self.map.data)
previewflag = True
上明確に、これは私が考えられる。このと検討を行うことが最も遅い方法ですからself.data
とself.map.data
は、テーブルクラスのインスタンスであること、私は200 * 200 * 3 =12万エントリのサイズを持って比較していますこれらのテーブルの一部。私はできるだけ早くこれが必要です。
私はそう
tempflag = False
#layer 1
slicepoint1 = 0
slicepoint2 = self.data.xsize * self.data.ysize * 1
data1 = self.data.data[slicepoint1:slicepoint2]
data2 = self.map.data.data[slicepoint1:slicepoint2]
if data1 != data2:
tempflag = True
layer1flag = True
#layer 2
slicepoint1 = self.data.xsize * self.data.ysize * 1
slicepoint2 = self.data.xsize * self.data.ysize * 2
data1 = self.data.data[slicepoint1:slicepoint2]
data2 = self.map.data.data[slicepoint1:slicepoint2]
if data1 != data2:
tempflag = True
layer2flag = True
#layer 3
slicepoint1 = self.data.xsize * self.data.ysize * 2
slicepoint2 = self.data.xsize * self.data.ysize * 3
data1 = self.data.data[slicepoint1:slicepoint2]
data2 = self.map.data.data[slicepoint1:slicepoint2]
if data1 != data2:
tempflag = True
layer3flag = True
#copy the data if it changed
if tempflag:
self.data = copy.deepcopy(self.map.data)
previewflag = True
のような1つのzのためのすべてのエントリをスライスする上記の比較を書き換えると考えられてきた、それはより速く、それが大幅に向上させることができているように、それはまだらしい行くようにこれは思えるながら。例えば、numpyを使用してTableクラスの中にデータリストを構築することはできないでしょうか? numpyのの使用は本当に速いので、私は内のデータを使用することができ、テーブルをループに私を許可するかどう
は、私はそれはおそらく
それもいいだろうことができます限り速く実行するには、このクラスと、このチェックが必要それブリット操作はタイルマップ
を構築するために私はは、テーブルのデータがself.dataに格納されていることをテーブルクラス、特に実際の一般的なインタフェースを維持する必要があるのですか要約速度が缶に
オペラのイオンはnumpyを使って増やすことができますか?もしそうなら、私はどのようにそれを行うことができますか?
これは、3Dデータを格納するのが非常に遅く厄介な方法のようです。 Pythonでネストされたリストを使用したとしても、より早く簡単になる可能性がありますが、おそらくnumpyの配列はもっと良い答えでしょう。 –