当前位置: 首页 > news >正文

《Python高性能编程》——2.2 Julia集合的介绍

本节书摘来自异步社区《Python高性能编程》一书中的第2章,第2.2节,作者[美] 戈雷利克 (Micha Gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 Julia集合的介绍

让我们从Julia集合这个有趣的CPU密集型问题开始。这是一个可以产生复杂的输出图像的分形数列,以数学家Gaston Julia的名字命名。

函数的代码相当长,你不会想要自己实现一个。它包含一个CPU密集型的组件和一个显式的输入集合。这一配置允许我们分析CPU和RAM的使用情况以帮助我们了解代码中哪部分过多地消耗了这两项计算资源。将代码故意做成非最优的实现,这样我们就可以检查耗内存的操作和慢的语句。我们在本章后面将修正一个慢的语句和一个耗内存的语句,然后在第7章,我们还将显著提升整个函数的执行时间。

我们将分析一段能够生成一个伪灰阶图(图2-1)和一个纯灰阶变种(图2-3)的代码,设Julia集合的复数点c=-0.62772-0.42193j。一个Julia集合可以通过独立计算每一个像素点得到,也就是说这是一个“完美并行计算的问题”,每个点之间没有任何数据共享。


screenshot

如果我们选择一个不同的c,就会得到一个不同的图像。根据我们的选择,有些区域算起来较快而另一些会较慢,这有助于我们的分析。

问题的有趣之处在于我们对每一个像素的计算都需要进行一个次数不定的循环。每一次迭代都需要计算坐标值是趋于无穷,还是收敛。那些经过少数迭代就能算出结果的坐标在图2-1上为黑色,而那些需要大量迭代才能算出结果的坐标为白色。白色区域需要更多计算,因此生成时间更长。

让我们定义一个z的坐标函数进行计算。函数会计算复数z的平方加c:


screenshot

我们迭代调用该函数并用abs计算逃逸条件。如果逃逸值为False,那么我们终止循环并在该坐标上记录下迭代的次数。如果逃逸条件始终不满足,那么我们在经过maxiter次迭代后终止,并将该z坐标转化为一个彩色像素点。

伪代码如下:

for z in coordinates:
    for iteration in range(maxiter): # limited iterations per point
        if abs(z) < 2.0: # has the escape condition been broken?
            z = z*z + c
        else:
            break
    # store the iteration count for each z and draw later

让我们试算两个坐标来解释这个函数。

首先,我们将使用图的左上角坐标-1.8-1.8j。在坐标更新前我们就必须首先计算逃逸条件abs(z) < 2:

z = -1.8-1.8j
print abs(z)

2.54558441227

我们可以看到第0次迭代逃逸条件即为False,于是我们不需要更新坐标。该坐标的输出值就是0。

现在让我们跳到图中央的z = 0 + 0j并尝试几次迭代:

c = -0.62772-0.42193j
z = 0+0j
for n in range(9):
    z = z*z + c
    print "{}: z={:33}, abs(z)={:0.2f}, c={}".format(n, z, abs(z), c)

0: z= (-0.62772-0.42193j),              abs(z)=0.76, c=(-0.62772-0.42193j)
1: z= (-0.4117125265+0.1077777992j),    abs(z)=0.43, c=(-0.62772-0.42193j)
2: z=(-0.469828849523-0.510676940018j), abs(z)=0.69, c=(-0.62772-0.42193j)
3: z=(-0.667771789222+0.057931518414j), abs(z)=0.67, c=(-0.62772-0.42193j)
4: z=(-0.185156898345-0.499300067407j), abs(z)=0.53, c=(-0.62772-0.42193j)
5: z=(-0.842737480308-0.237032296351j), abs(z)=0.88, c=(-0.62772-0.42193j)
6: z=(0.026302151203-0.0224179996428j), abs(z)=0.03, c=(-0.62772-0.42193j)
7: z= (-0.62753076355-0.423109283233j), abs(z)=0.76, c=(-0.62772-0.42193j)
8: z=(-0.412946606356+0.109098183144j), abs(z)=0.43, c=(-0.62772-0.42193j)

我们可以看到,每次迭代都令abs(z) < 2为True。我们可以对该坐标迭代300次依然为True。我们无法得知需要多少次迭代才能令条件为False,可能是个无穷数列。最大迭代次数(maxiter)会确保我们不至于永远迭代下去。

我们在图2-2中可以看到前50个迭代结果。0+0j的结果数列(带圆形标记的实线)似乎每8个迭代出现一次循环,但是每个循环都跟前一个有微小的区别——我们无法得知该坐标是会永远迭代下去,还是将要迭代很长时间,还是马上就会超出边界条件。短划线cutoff表示+2的边界线。


screenshot

对于-0.82+0j的结果数列(带菱形标记的短划线),我们可以看到第9次迭代后绝对值结果就超出了+2的cutoff边界线,于是迭代终止。

相关文章:

  • 2007年个人回忆与总结
  • 《Node应用程序构建——使用MongoDB和Backbone》一导读
  • Linux/UNIX 命令行大全完整版
  • 《JavaScript面向对象精要》——1.5 访问属性
  • 呀呀学语
  • 《自己动手做交互系统》——1.3 本章小结
  • 《草根自媒体达人运营实战》一一2.2 坚持
  • 几个正则表达式(1.ZF翻页url:保存其他参数,).
  • 《脱颖而出——成功网店经营之道》一2.4 可持续化发展
  • 了解一下soap
  • Mobile devices bundled with malware?
  • [翻译]谈话记录:介绍Microsoft Robotics Studio
  • 大型网站的 HTTPS 实践(二):HTTPS 对性能的影响
  • SAP标准课程列表
  • 新手指南:在 Ubuntu 和 Fedora 上安装软件包
  • 【刷算法】求1+2+3+...+n
  • css的样式优先级
  • js 实现textarea输入字数提示
  • PHP变量
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Terraform入门 - 1. 安装Terraform
  • Vue2.x学习三:事件处理生命周期钩子
  • 安装python包到指定虚拟环境
  • 初探 Vue 生命周期和钩子函数
  • 浮现式设计
  • 关于字符编码你应该知道的事情
  • ------- 计算机网络基础
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​比特币大跌的 2 个原因
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2)(2.10) LTM telemetry
  • (3)nginx 配置(nginx.conf)
  • (c语言)strcpy函数用法
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)hibernate配置管理
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转载)虚函数剖析
  • .form文件_SSM框架文件上传篇
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core 版本不支持的问题
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • ??在JSP中,java和JavaScript如何交互?
  • @GlobalLock注解作用与原理解析
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [20170713] 无法访问SQL Server