这是我在这里的第一篇文章,所以如果我没有遵守规则,我很抱歉
现在,我已经尝试过在没有任何复杂参数的情况下编写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是迭代的次数
这是我得到的结果:

我觉得这和我想要的有点接近。
现在我的问题是,怎样才能让函数更快呢?我怎样才能让它变得更好呢?
非常感谢!
发布于 2015-03-29 01:17:25
一个很好的起点是分析你的代码。
https://docs.python.org/2/library/profile.html
如果我不得不在没有亲自分析的情况下进行猜测,那么你的数组追加可能效率很低。
您可以使用预先设置为适当大小的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),"%")你想要更快的code?...remove与实际绘图无关的东西。
此外,在比较之后中断一个for循环,然后在比较之后生成您想要的相同的comparison...Do,然后中断it...No需要计算两次。
https://stackoverflow.com/questions/29319916
复制相似问题