Mandelbrot使用matplotlib在python上设置+需要一些建议

时间:2015-03-28 16:56:56

标签: python mandelbrot

这是我在这里的第一篇文章,所以如果我不遵守规则,我很抱歉

我最近学过python,我知道基础知识,我喜欢写着名的集合并绘制它们,我已经编写了hofstadter序列的代码,一个逻辑序列并且都成功了

现在我已经尝试过编写没有任何复杂参数的mandelbrot序列,但实际上是“手工”了

例如,如果Z(n)是我的复合体(x + iy)变量而C(n)是我的复数(c + ik)

我把序列写成{x(n)= x(n-1)^ 2-y(n-1)^ 2 + c; Y(N)= 2.x的第(n-1).Y第(n-1)+ C}

from math import *
import matplotlib.pyplot as plt

def mandel(p,u):
    c=5
    k=5
    for i in range(p):
        c=5
        k=k-10/p
        for n in range(p):
            c=c-10/p
            x=0
            y=0
            for m in range (u):
                x=x*x-y*y + c
                y=2*x*y + k
                if sqrt(x*x+y*y)>2:
                    break
            if sqrt(x*x+y*y)<2:
                X=X+[c]
                Y=Y+[k]
        print (round((i/p)*100),"%")
    return (plt.plot(X,Y,'.')),(plt.show())

p是我想要的复杂参数的宽度和数量,u是迭代次数

这就是我得到的结果:

http://i.stack.imgur.com/aPq1k.png

我认为这与我想要的有点接近。

现在我的问题是,如何让这项功能更快?我怎样才能让它变得更好?

非常感谢!

1 个答案:

答案 0 :(得分:0)

一个好的起点是分析您的代码。

https://docs.python.org/2/library/profile.html

使用cProfile模块或命令行分析器,您可以找到代码的低效部分并尝试优化它们。如果我不想在没有亲自分析它的情况下进行猜测,那么你的数组附加可能效率低下。

你可以使用预制的适当大小的numpy数组,或者在纯python中你可以创建一个给定大小的数组(如50)并完成整个数组。当它填满时,将该数组附加到主阵列。这减少了阵列必须重建的次数。使用numpy数组也可以这样做。

你可以做的快速事情

if sqrt(x*x+y*y)>2:

应该成为这个

if x*x+y*y>4:

如果可以的话,删除对sqrt的调用,更快地将另一方取幂为2.乘法比找到根要便宜。

你可以做的另一件事是。

print (round((i/p)*100),"%")

应该成为这个

# print (round((i/p)*100),"%")

您想要更快的代码吗?...删除与实际绘图无关的内容。

此外,你在比较后打破一个for循环,然后进行相同的比较...在比较后做你想做的事情,然后打破它......不需要计算两次。

相关问题