- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
9.2 使用蒙特卡罗方法来估算 pi
我们可以通过向一个由一个单位圆所代表的飞镖靶子投掷几千枚虚构的飞镖来估算pi。落入圆圈的边缘内和边缘外的飞镖数量之间的关系将允许我们来趋近pi。
这是第一个理想问题,因为我们可以把整个工作负载在一定数量的进程间均匀地拆分,每一个运行在一个独立的CPU上面。每一个进程将会同时结束,因为每一个进程的工作负载是均等的,所以在我们给问题增加新的CPU和超线程时,我们可以调查可得到的速度提升。
在图9-1中,我们朝单位圆投掷了10 000枚飞镖,其中一定比例的飞镖落入了画出来的单位圆的四等分之内。这个估算很坏——10 000枚飞镖投掷没有可靠地给出我们三小数位的结果。如果你运行自己的代码,会看到每一轮估算值在3.0到3.2之间变化。
为了对第一个三小数位有信心,我们需要产生10 000 000个随机飞镖投掷。这是低效的(存在更好的pi值估算方法),但是它相当方便地演示了使用multiprocessing做并行化的好处。
随着蒙特卡罗方法,我们使用Pythagorean理论来测试一个飞镖是否在我们的圆圈内着落:
因为我们使用了一个单位圆,所以我们能够通过移除平方根操作(12=1)来优化,给我们留以一个简化的表达式去实现:
图9-1 使用蒙特卡罗方法来估算pi
我们在例9-1中会看到一个循环的版本。我们会实现一个普通的Python版本,以及以后实现一个numpy版本,我们都将使用线程和进程来并行化问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论