这是我在这里的第一篇文章,所以如果我不遵守规则,我很抱歉
我最近学过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是迭代次数
这就是我得到的结果:
我认为这与我想要的有点接近。
现在我的问题是,如何让这项功能更快?我怎样才能让它变得更好?
非常感谢!
答案 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循环,然后进行相同的比较...在比较后做你想做的事情,然后打破它......不需要计算两次。