这需要一个多小时来渲染这个mandelbrot集,只需要100次迭代,而用了10个小时进行10000次迭代。有没有办法让它更快:
from graphics import *
width = 700
height = 700
win = GraphWin("Mandelbrot",width,height)
spacing = 1
zoom = 0.1
xOffset = -0.171
yOffset = 0.61
win.setBackground('black')
for x in range(0,width,spacing):
for y in range(1,height,spacing):
a = ((x / width) * zoom) - xOffset
b = ((y / height) * zoom) - yOffset
pt = Point(x,y)
n = 0
ca = a
cb = b
while(n<10000):
aa = a * a - b * b
bb = 2 * a * b
a = aa + ca
b = bb + cb
n+=1
if(abs(a+b) > 2000):
break
if(n < 2000):
pt.setFill('black')
if(n>5000):
pt.setFill('grey')
if(n>1000):
pt.setFill('white')
pt.draw(win)
除了@RaymondHettinger建议的复数之外,我们还可以通过Zelle graphics明智的方法来加快速度。第一个是不要使用
Point()
,它有太多的开销。它自己的win
实例有一个用于位图操作的plot()
方法,该方法没有Point()
的开销,即不能解绘,不能移动它。在第二种方法是关闭autoflush并对每个列执行我们自己的屏幕刷新。最后,简单地避免做任何不需要的计算,例如
ca
可以在外循环中计算,而不是在内部循环中计算。颜色可以在最里面的循环外计算,等等下面是我的重做,如上面所述,对70 x 70图像进行计时,比原始代码快7倍:
虽然不是我们所希望的全部数量级,但减少7小时的周转时间仍然令人沮丧!在
最后,你的代码中有一个错误,它可以防止像素变成灰色,我已经修复了。在
最快的方法可能是numpy。 有关此方法的详细信息,请参见"How To Quickly Compute The Mandelbrot Set In Python"。在
对于纯Python,使用本机的complex numbers来加速循环。还可以使用abs()函数快速计算复数的大小:
渲染本身不太可能是程序的慢部分(10000个循环会缩短绘制点的时间)。也就是说,如果要加快渲染速度,通常唯一的选择是每次调用图形库绘制多个点。在
最后,考虑您是否真的希望最大迭代次数为10000次。您可以通过最多200次迭代获得良好的结果。在
相关问题 更多 >
编程相关推荐