这需要花费一个多小时来渲染这个mandelbrot设置只有100次迭代,并且需要10个小时进行10,000次迭代。有没有办法让它更快:
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)
答案 0 :(得分:4)
numpy可能的最快方式。 有关此方法的详细信息,请参阅"How To Quickly Compute The Mandelbrot Set In Python"。
对于普通的纯Python,使用本机complex numbers来加速循环。还可以使用abs()函数快速计算复数的大小:
>>> def mandle(c, boundary=2.0, maxloops=10000):
# https://en.wikipedia.org/wiki/Mandelbrot_set
z = 0.0j
for i in range(maxloops):
z = z * z + c
if abs(z) > boundary:
break
return i
>>> mandle(0.04 + 0.65j)
21
>>> mandle(0.04 + 0.66j)
16
>>> mandle(0.04 + 0.67j)
12
渲染本身不可能是程序的缓慢部分(10,000个循环可以使绘制点的时间相形见绌)。也就是说,如果你想加快渲染速度,通常唯一的选择是每次调用图形库时绘制多个点。
最后,考虑一下您是否真的希望最大迭代次数为10,000次。您可以获得最佳结果,最多200次迭代。
答案 1 :(得分:0)
除了@RaymondHettinger建议的复杂数字之外,还有一些我们可以做Zelle图形方面的事情来加快速度。第一个是不使用Point()
,它有太多的开销。它自己的win
实例有一个用于位图操作的plot()
方法,它没有Point()
的开销,即无法绘制它,不能移动它。
第二种方法是关闭autoflush并在每列上进行自己的屏幕刷新。最后,简单地避免做任何你不需要的计算 - 例如ca
可以在外循环中计算,而不是在内循环中计算。可以在最里面的循环之外计算颜色等。
这是我上面的返工 - 计时70 x 70图像,比原始代码快7倍:
from graphics import *
spacing = 1
zoom = 0.1
xOffset, yOffset = -0.171, 0.61
width, height = 700, 700
win = GraphWin('Mandelbrot', width, height, autoflush=False)
win.setBackground('black')
xzoom, yzoom = zoom / width, zoom / height
for real in range(0, width, spacing):
ca = real * xzoom - xOffset
for imaginary in range(0, height, spacing):
c, z = complex(ca, imaginary * yzoom - yOffset), 0j
n = 0
while n < 10000:
if abs(z) > 2000:
break
z = z * z + c
n += 1
color = 'black'
if n > 5000:
color = 'grey'
elif n > 1000:
color = 'white'
if color != 'black':
win.plot(real, imaginary, color=color)
win.flush()
不是我们可能希望的完整数量级,但是减少七个小时的时间仍然是一些事情!
最后,您的代码中存在一个错误,使像素不会出现灰色 - 我已经解决了这个问题。