私はPythonでOOPを学んでいます。だから少し楽しみのために、私は今朝、GameOfLifeシミュレータを立ち上げました。起動時には、1秒間に約20サイクル(plt.pause(0.05)
が追加されているため)に実行されますが、数秒以内に1秒あたり〜2サイクルまで減速します。私のGame of Lifeシミュレーションが数秒でクロールに遅くなるのはなぜですか?非難するMatplotlib?
私はそれがアルゴリズムそのものであるとは想像もできません。メモリリークの原因が分かりません。
matplotlibは古いプロットをダンプすることができませんが、何千ものオーバーレイされた画像が蓄積されていますか?私はdel im
を追加しようとしましたが、それは役に立たなかった...
これは重要ではありませんが、私は答えから何かを学ぶことができたと感じています。
PS私の実装が貧弱だと思うなら、私に教えてください、私は学びたいです!
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import convolve
import time
class GoL():
KERNEL = np.array([[1, 1, 1],
[1, 0, 1],
[1, 1, 1]])
def __init__(self, width, height, p=0.3):
self.width = width
self.height = height
self.matrix = np.random.choice(a=[1, 0], size=(width, height), p=[p, 1 - p])
def play(self):
self.plot()
while True:
self.cycle()
def cycle(self):
c = self.eval()
for x in range(1,self.width-1):
for y in range(1,self.height-1):
c_val = c[x,y]
if c_val == 3: self.matrix[x,y] = 1 #Alive regardless of whether cell alive or dead
elif c_val < 2: self.matrix[x,y] = 0 #Dead regardless of whether cell alive or dead
elif c_val > 3: self.matrix[x,y] = 0 #Dead regardless of whether cell alive or dead
elif self.matrix[x,y] == 1 and c_val == 2: self.matrix[x,y] = 1 #If a living cell with 2 neighours, live
else: self.matrix[x,y] = 0 #Only other option is dead with 2 neighbours; die
self.plot()
def eval(self):
c = convolve(self.matrix, GoL.KERNEL, mode='constant')
return c
def plot(self):
im = plt.imshow(self.matrix)
plt.pause(0.05)
del im #Added to see if speeds things up; it does not
して実行する:
gol = GoL(width=100,height=100)
gol.play()
見つけるための最善の方法は、コードをプロファイリングすることです。 matplotlibs 'ion'や' 'animation''(https://matplotlib.org/api/animation_api.html)を使用していますか? – MSeifert