【问题标题】:Mandelbrot set on python using matplotlib + need some advicesMandelbrot 使用 matplotlib 在 python 上设置 + 需要一些建议
【发布时间】:2015-03-29 01:39:45
【问题描述】:

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

我最近学习了 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 是迭代次数

这就是我得到的结果:

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

现在我的问题是,我怎样才能使函数更快?我怎样才能让它变得更好?

非常感谢!

【问题讨论】:

    标签: python mandelbrot


    【解决方案1】:

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

    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 循环,然后进行相同的比较...在比较后执行您想要的操作,然后将其中断...无需计算两次。

    【讨论】:

    • 感谢您的回答。我实际上打破了第一个循环,因为我不想听到关于模块超过 2 的序列的任何信息,所以我立即打破它而不是等待它完成然后我将参数添加到情节
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多