私はビジュアルアーティストで、特定の作品を作成するためにPythonを学んでいます。 1つは、2160x3840グリッドを使用して、Conwayの古典的なGame of Lifeをコーディングしています。Python(Numpy)配列の等しい関数が遅いです...より速い方法がありますか?
しかし、プログラムは私が望んでいたよりも遅く実行されています。私の3歳のiMacで24時間稼働しています.2.5フレームしか処理されません。走るには数週間かかりますが、私はいくつかの走りがあります。
私はSnakeVizを実行しました。私のプログラムの時間の93%は、一次アクティビティが一連の比較である単一の関数で費やされています。すべての「ピンチ」カラーとflashOfLifeColorは、コンウェイのルールの点で「ライブ」セルとみなされます。
def isLive (theColor):
isCellLive = False
finchColor_1 = numpy.array([247, 238, 214])
finchColor_2 = numpy.array([202, 184, 88])
finchColor_3 = numpy.array([103, 81, 68])
flashOfLifeColor = numpy.array([249, 192, 0])
if (numpy.array_equal(theColor, finchColor_1)) or
(numpy.array_equal(theColor, finchColor_2)) or
(numpy.array_equal(theColor, finchColor_3)) or
(numpy.array_equal(theColor, flashOfLifeColor)):
isCellLive = True
return isCellLive
if文を書く方が良い(より速い)方法はありますか?私は物事をスピードアップするために最適化以外で何かできることはありますか?
おかげで、
--Darin編集:ここでは
は私がやっているものを理解するためにisLiveの各を呼び出している関数です。また、私はPythonプログラミングの新機能であり、オブジェクトプログラミングも全く知らないということをもう一度言及したいと思います。先進的なテクニックではありません。私が見ているConwayの規則の実装の一部を解読するのは苦労します。ウェブ。
def countNeighborsNine(theArray, row, column):
numberOfNeighbors = 0
maxRow, maxColumn, depth = theArray.shape
for rowModifier in range (-1,2):
for columnModifier in range (-1, 2):
rowNeighborPointer = (row + rowModifier) % maxRow
columnNeighborPointer = (column + columnModifier) % maxColumn
thePixel = theArray[rowNeighborPointer, columnNeighborPointer]
if isLive(thePixel):
numberOfNeighbors = numberOfNeighbors + 1
return numberOfNeighbors
とすぐに私は明らかに改善が見られ、この投稿として - 比較のため、代わりにライブ色の「死んだ」色を使用。死んだ色は3色あります。それ以上の改善はまだ必要です。 –
私が理解する限り、細胞の色を保存してから、その色から状態を再構成します。なぜあなたはそれをやっているのですか?セルの状態をブール値または整数値として保存し、この 'isLive'関数を完全に避けてみませんか? –
btw、この実装を試すことができますhttps://rosettacode.org/wiki/Conway%27s_Game_of_Life#Python –