产品特色
编辑推荐
许多物理学家在研究工作中还要扮演软件开发人员的角色。但即使对于物理学家来说,也不是所有的软件开发任务都很简单。本书是一本实践指南,介绍了软件开发的许多基本技能,能够帮助读者自动化地完成物理领域几乎所有方面的研究。
本书由两位核工程博士编写,书中包含了物理领域的许多实际案例。通过阅读本书,读者会学到如何用Python编程语言收集、分析数据,构建软件,发布结果等技能。
本书分为4个部分。
起步:掌握Python、命令行、数据容器、函数、流程控制以及逻辑、类和对象。
上手:学习正则表达式、分析和可视化、NumPy、用文件和HDF5存储数据、物理中重要的数据结构、并行计算以及部署软件。
完善:构建流程和软件;使用本地和远程版本控制、调试并测试代码。
发布:为代码生成文档;发布研究结果;提高协作效率;了解软件许可证、所有权和版权的处理流程。
内容简介
本书介绍了如何通过Python自动化地完成物理领域方面的研究。全书共分为4个部分,以Python代码为示例向读者介绍了如何用Python解决物理项目中出现的各种问题。第 1部分(第 1~6章):起步,介绍Python的基本知识,如命令行、数据容器、类和对象等。第 2部分(第7~13章):上手,主要介绍正则表达式、数据可视化、存储数据等实用知识。第3部分(第 14~18章):完善,介绍如何构建流程和软件、版本控制、调试和控制代码等。第4部分(第 19~23章):发布,介绍如何为代码生成文档、如何提高协作效率和软件许可证以及版权的相关知识等。
本书适合想要通过Python减少工作量的物理学领域的研究人员阅读,也适合想要学习如何通过Python编程解决物理问题的读者参考。
作者简介
Anthony Scopatz是计算物理学家和资 深Python开 发 者。Anthony拥有加州大学圣塔芭芭拉分校的理学学士学位,以及得克萨斯大学奥斯汀分校的机械/核能博士学位。Enthought前员工,曾在芝加哥大学天文物理学系的Flash Center进行博士后研究,目前是威斯康星大学麦迪逊分校工程物理系的工作人员,主要研究核燃料循环的基本物理建模、信息理论和熵。Anthony是Python软件基金会的成员,并在许多会议上进行过以科学和软件开发为主题的演讲。
Kathryn D.Huff是伯克利数据科学研究所的研究员,也是加州大学伯克利分校核能科学与安全联盟的博士后研究员。2013年获得威斯康星大学麦迪逊分校的核工程博士学位。她还拥有芝加哥大学物理学学士学位。她参与了实验宇宙天体物理学、实验非平衡粒状物相动力学、计算核燃料循环分析、计算反应堆事故中子学等领域的研究。在威斯康辛州,她是科学计算机组织Hacker Within的创始人,自2011年以来一直担任Software Carpentry的讲师。在专业的其他方面,她目前是美国核学会的部门主管,连续两年担任Scientific Computing with Python (SciPy)会议的程序委员会联合主席。
目录
第 一部分 起步
第 1章 命令行简介 3
1.1 Shell概览 3
1.1.1 Shell是 一 款编程
语言 4
1.1.2 路径和pwd 5
1.1.3 主目录(~) 7
1.1.4 列出内容(ls) 8
1.1.5 更改目录(cd) 9
1.1.6 查看文件内容(head
和tail命令) 12
1.2 操作文件和目录 12
1.2.1 创建文件(nano、emacs、
vi、cat、>、
touch) 12
1.2.2 复制和重命名文件
(cp和mv) 17
1.2.3 创建目录
(mkdir) 18
1.2.4 删除文件和目录
(rm) 19
1.2.5 标志和通配符 21
1.3 获取帮助 22
1.3.1 阅读程序手册
(man) 22
1.3.2 找到正确的
工具(apropos) 24
1.3.3 用重定向和管道组合
多个实用程序
(>、>>、|) 25
1.4 权限和共享 26
1.4.1 查看权限(ls –l) 27
1.4.2 设置所有权 28
1.4.3 设置权限
(chmod) 29
1.4.4 创建链接(ln) 29
1.4.5 连接其他计算机
(ssh和scp) 30
1.5 环境 31
1.5.1 保存环境变量
(.bashrc) 33
1.5.2 运行程序
(PATH) 34
1.5.3 别名命令
(alias) 35
1.6 使用bash编写脚本 36
1.7 本章小结 38
第 2章 Python编程起步 39
2.1 运行Python 40
2.2 注释 41
2.3 变量 42
2.4 特殊变量 44
2.4.1 布尔值 44
2.4.2 None不是0! 45
2.4.3 NotImplemented
不是None! 45
2.5 操作符 45
2.6 字符串 49
2.6.1 字符串索引 50
2.6.2 字符串连接 52
2.6.3 字符串字面值 53
2.6.4 字符串方法 55
2.7 模块 56
2.7.1 导入模块 56
2.7.2 从模块中导入
变量 57
2.7.3 别名导入 58
2.7.4 导入变量别名 58
2.7.5 包 59
2.7.6 标准库和Python
生态系统 61
2.8 本章小结 62
第3章 基本容器 63
3.1 列表 64
3.2 元组 68
3.3 集合 69
3.4 字典 71
3.5 本章小结 73
第4章 流程控制和逻辑运算 75
4.1 条件语句 75
4.1.1 if-else语句 78
4.1.2 if-elif-else语句 79
4.1.3 if-else表达式 80
4.2 异常 80
4.2.1 抛出异常 81
4.3 循环 83
4.3.1 while循环 83
4.3.2 for循环 85
4.3.3 解析式 87
4.4 本章小结 90
第5章 使用函数 91
5.1 Python中的函数 91
5.2 关键字参数 94
5.3 变长参数 96
5.4 多返回值 98
5.5 作用域 99
5.6 递归 102
5.7 lambda 103
5.8 生成器 104
5.9 装饰器 107
5.10 本章小结 110
第6章 类和对象 112
6.1 面向对象 112
6.2 对象 113
6.3 类 117
6.3.1 类变量 118
6.3.2 实例变量 120
6.3.3 构造器 121
6.3.4 方法 123
6.3.5 静态方法 126
6.3.6 鸭子类型 127
6.3.7 多态 128
6.4 装饰器和元类 132
6.5 本章小结 134
第 2部分 上手
第7章 分析和可视化 139
7.1 准备数据 139
7.1.1 实验数据 143
7.1.2 模拟数据 144
7.1.3 元数据 145
7.2 载入数据 145
7.2.1 NumPy 146
7.2.2 PyTables 147
7.2.3 Pandas 147
7.2.4 Blaze 148
7.3 清理和改写数据 149
7.4 分析 153
7.4.1 模型驱动的分析 154
7.4.2 数据驱动的分析 155
7.5 可视化 156
7.5.1 可视化工具 157
7.5.2 gnuplot 158
7.5.3 matplotlib 160
7.5.4 Bokeh 165
7.5.5 Inkscape 167
7.6 本章小结 167
第8章 正则表达式 169
8.1 示例:杂乱的磁性 170
8.2 命令行中的元字符 171
8.2.1 用简单的模式
列出文件 172
8.2.2 根据模式全局查找
文件名(find) 173
8.3 grep、sed、awk 179
8.4 在文件中查找模式
(grep) 179
8.5 在文件中查找和替换
(sed) 181
8.5.1 查找和替换复杂
模式 183
8.5.2 sed额外内容 184
8.6 处理数据列(awk) 186
8.7 Python正则表达式 188
8.8 本章小结 190
第9章 NumPy:以数组的形式
思考 192
9.1 数组 193
9.2 dtype 195
9.3 切片和视图 198
9.4 算术和广播 200
9.5 花式索引 204
9.6 掩模 206
9.7 结构数组 209
9.8 通用函数 211
9.9 其他有用的函数 213
9.10 本章小结 215
第 10章 数据存储:文件和
HDF5 216
10.1 Python中的文件 217
10.2 关于计算机架构的一些说明 221
10.3 HDF5中的重要思想 223
10.4 文件处理 225
10.5 层次布局 227
10.6 分块 229
10.7 核内和核外操作 233
10.7.1 核内 233
10.7.2 核外 234
10.8 查询 235
10.9 压缩 236
10.10 HDF5工具 237
10.11 本章小结 239
第 11章 物理中重要的数据
结构 240
11.1 散列表 240
11.1.1 调整大小 242
11.1.2 冲突 243
11.2 数据框 245
11.2.1 Series 246
11.2.2 DataFrame结构 247
11.3 B数 250
11.4 k-d树 252
11.5 本章小结 256
第 12章 并行化执行 258
12.1 规模和扩展能力 259
12.2 问题分类 261
12.3 示例:N体问题 262
12.4 非并行 263
12.5 线程 267
12.6 多处理 273
12.7 MPI 276
12.8 本章小结 281
第 13章 软件部署 283
13.1 部署软件本身 284
13.1.1 pip 285
13.1.2 Conda 289
13.1.3 虚拟机 292
13.1.4 Docker 293
13.2 部署到云端 297
13.3 在超算上部署 299
13.4 本章小结 300
第3部分 完善
第 14章 构建流程和软件 305
14.1 make 306
14.1.1 运行make 308
14.1.2 makefile 308
14.1.3 目标 309
14.1.4 特殊目标 311
14.2 构建和运行软件 312
14.2.1 Makefile配置 313
14.2.2 编译 316
14.3 安装 316
14.4 本章小结 317
第 15章 本地版本控制 318
15.1 什么是版本控制 318
15.1.1 计算物理中的
实验室笔记本 319
15.1.2 版本控制工具的
类型 320
15.2 Git起步 320
15.2.1 安装Git 321
15.2.2 获取帮助 321
15.2.3 控制Git的行为
(git config) 322
15.3 使用Git进行本地版本
控制 323
15.3.1 创建本地库
(git init) 323
15.3.2 暂存文件 325
15.3.3 检查本地副本的状态
(git status) 326
15.3.4 保存快照
(git commit) 326
15.3.5 git log:查看
历史 329
15.3.6 查看改动
(git diff) 329
15.3.7 取消暂存或回滚文件
(git reset) 330
15.3.8 丢弃提交
(git revert) 331
15.3.9 列出、创建、删除分
支(git branch) 332
15.3.10 切换分支
(git checkout) 334
15.3.11 合并分支
(git merge) 334
15.3.12 处理冲突 336
15.4 本章小结 336
第 16章 远程版本控制 337
16.1 代码托管(github.com) 337
16.2 在GitHub上创建
代码库 339
16.3 声明远程库
(git remote) 339
16.4 向远程库发送提交
(git push) 340
16.5 下载代码库
(git clone) 341
16.6 从远程库获取内容
(git fetch) 344
16.7 合并远程库的内容
(git merge) 345
16.8 Pull等于Fetch加Merge
(git pull) 345
16.9 冲突 346
16.10 解决冲突 347
16.11 本章小结 348
第 17章 调试 350
17.1 遇到一个bug 351
17.2 print语句 352
17.3 交互式调试 354
17.4 在Pythong中调试
(pdb) 355
17.4.1 设置跟踪点 356
17.4.2 步进 357
17.4.3 查询变量 358
17.4.4 设置状态 358
17.4.5 运行函数和
方法 359
17.4.6 继续执行 359
17.4.7 断点 360
17.5 剖析 360
17.5.1 使用pstats查看
剖析文件 361
17.5.2 可视化查看剖析
信息 361
17.5.3 使用Kernprof剖析
代码 364
17.6 linting 365
17.7 本章小结 366
第 18章 测试 368
18.1 为什么要做测试 369
18.2 什么时候写测试 369
18.3 在哪里编写测试 370
18.4 如何测试?测试哪些
内容 370
18.5 运行测试 373
18.6 边界情形 374
18.7 单元测试 376
18.8 集成测试 378
18.9 回归测试 380
18.10 测试生成器 380
18.11 测试覆盖 382
18.12 测试驱动开发 383
18.13 本章小结 386
第4部分 发布
第 19章 文档 389
19.1 为什么文档很重要 389
19.1.1 文档非常有价值 390
19.1.2 编写文档比想象的
要简单 390
19.2 文档类型 391
19.2.1 理论手册 391
19.2.2 用户和开 发 者
指南 392
19.2.3 readme文件 392
19.2.4 注释 393
19.2.5 自文档代码 395
19.2.6 文档字符串 396
19.3 自动化 397
19.4 本章小结 401
第 20章 出版 402
20.1 文档处理 403
20.1.1 格式和内容
分离 403
20.1.2 跟踪改动 404
20.2 文本编辑器 404
20.3 标记语言 405
20.3.1 LaTeX 406
20.3.2 参考文献 416
20.4 本章小结 419
第 21章 协作 421
21.1 任务单系统 422
21.1.1 工作流程概览 422
21.1.2 创建问题 424
21.1.3 分配问题 425
21.1.4 讨论问题 426
21.1.5 关闭问题 427
21.2 拉取请求和代码审查 427
21.2.1 提交拉取请求 428
21.2.2 审查合并请求 428
21.2.3 合并拉取请求 429
21.3 本章小结 429
第 22章 许可证、所有权和
版权 430
22.1 哪些内容可赋予版权 431
22.2 首 次发布权 431
22.3 什么是公共领域 432
22.4 选择一个软件许可证 432
22.5 伯克利软件发布
许可证(BSD) 434
22.6 GNU General Public
License (GPL) 436
22.7 知识共享(CC) 437
22.8 其他许可证 438
22.9 更换许可证 440
22.10 版权不是一切 441
22.11 本章小结 442
第 23章 关于计算物理进一步
思考 443
术语 447
Python物理学高效计算:拨开计算迷雾,拥抱科学洞察 在现代物理学研究的广阔天地里,数值计算早已不再是辅助工具,而是驱动科学发现、解析复杂现象、甚至是预测未来趋势的核心引擎。从宇宙大尺度结构的模拟,到量子世界的精妙互动,再到材料科学的分子动力学演化,海量的物理数据和复杂多变的数学模型,无时无刻不在挑战着我们处理信息和解决问题的能力。然而,传统的手算方法早已无法应对这种挑战,即便是现有的许多通用计算软件,也可能因为其通用性而牺牲了针对特定物理问题的效率和灵活性。 正是在这样的背景下,Python物理学高效计算 应运而生,它并非简单地罗列物理公式或讲解Python语法,而是致力于构建一座连接物理学理论与强大计算能力的桥梁,帮助研究者们更深入、更高效地探索物理世界的奥秘。本书的核心理念在于,通过精妙的算法设计、优化的数据结构以及Python生态系统中丰富而强大的科学计算库,将抽象的物理概念转化为可执行、可分析的计算模型,从而加速科学研究的进程,并最终揭示那些隐藏在数据背后深刻的物理规律。 本书将带领您深入理解如何利用Python的强大能力,去驾驭那些曾经令人生畏的计算难题。我们不只是告诉你“怎么做”,更会深入探讨“为什么这样做”以及“如何做得更好”。这意味着,您将不仅仅是掌握一套工具的使用方法,更能培养一种将物理问题转化为计算思维、并最终用高效代码来求解的科学素养。 深入量子力学的计算前沿 量子力学,作为描述微观世界行为的基石,其核心方程(如薛定谔方程)的解析解往往只适用于极其简化的模型。对于现实世界中更复杂、多体相互作用的系统,数值求解便成为唯一的途径。本书将系统地介绍如何运用Python中的高级数值方法来解决这些问题。 您将学习到如何使用NumPy和SciPy等库构建和操作大规模的向量和矩阵,这是表示量子态和哈密顿量的基础。我们将深入探讨对角化方法,例如使用SciPy的 `linalg.eig` 函数来求解小规模系统的能量本征值和本征态,并分析其在计算原子、分子能量时的应用。 然而,对于包含大量粒子的大型量子系统,直接对角化哈密顿量在计算上变得不可行。这时,数值迭代方法的威力便显现出来。本书将详细讲解共轭梯度法、Lanczos算法等高效的求解大型稀疏矩阵特征值的方法,这些方法能够绕过显式构建和存储完整的哈密顿量,大大降低内存和计算资源的需求。您将通过实例学习如何在Python中实现这些算法,并理解它们在量子多体理论中的应用,例如计算格点模型中的低能激发态。 此外,量子蒙特卡洛方法因其在处理高维积分和复杂量子系统方面的独特优势而备受瞩目。本书将引导您理解变分蒙特卡洛和扩散蒙特卡洛的基本原理,并演示如何利用Python进行这些方法的实现,例如计算费米子系统的基态能量,以及探索关联函数的计算。 更进一步,本书将触及密度矩阵重整化群(DMRG)等先进的数值技术,它在求解一维量子多体系统方面取得了巨大的成功。虽然DMRG的完整实现可能较为复杂,但我们将为您梳理其核心思想,并展示如何利用现有的Python库(如`pyscf`中的部分功能或第三方DMRG实现)来应用它,从而解决具有挑战性的量子相变等问题。 模拟经典物理系统的动态演化 经典物理学同样是数值计算的沃土,从宏观的流体动力学到微观的分子动力学,都需要强大的计算工具来捕捉系统的动态演化。 在流体动力学领域,本书将介绍如何使用有限差分法、有限体积法或有限元法来离散化Navier-Stokes方程组。您将学习如何利用Python中的NumPy和SciPy来高效地实现这些方法,并求解经典的流体问题,例如伯格斯方程的数值解、泳池中的水波模拟,以及二维不可压缩流的帕克-肖(Patankar-Shaw)方法。我们将重点讲解时间积分方案的选择,如前向欧拉法、龙格-库塔法(Runge-Kutta)及其在保持数值稳定性和提高计算精度方面的权衡。 分子动力学(MD)是研究物质在原子和分子尺度上动态行为的强大工具。本书将为您揭示MD模拟的基本原理,包括牛顿运动方程的求解、力场的选择以及边界条件的处理。您将学习如何利用Python来实现一个简化的MD模拟器,从初始化粒子位置和速度,到使用 Verlet 算法或 Leapfrog 算法进行时间积分,再到计算粒子间的相互作用力。我们将讨论如何优化计算过程,例如利用周期性边界条件来模拟宏观系统,以及如何进行能量最小化以找到稳定构象。 此外,本书还将探讨如何利用Python的强大绘图库(如Matplotlib和Seaborn)来可视化模拟结果,例如轨迹图、速度分布图、能量随时间的变化等,从而直观地理解系统的物理过程。 探索概率与统计在物理计算中的应用 概率和统计方法在现代物理学中扮演着越来越重要的角色,尤其是在处理复杂系统、进行数据分析和模型拟合时。 蒙特卡洛方法,除了在量子力学中的应用,在经典物理领域同样用途广泛。本书将详细介绍随机游走、Metropolis-Hastings算法等核心的蒙特卡洛抽样技术。您将学习如何利用Python的`random`模块和NumPy的随机数生成器来实现这些算法,并将其应用于求解复杂的积分问题,例如计算高维空间体积、伊辛模型的能量期望值,以及统计力学中的相空间采样。 我们将深入探讨贝叶斯推断在物理模型参数估计中的应用。您将学习如何利用MCMC(马尔可夫链蒙特卡洛)方法,如吉布斯采样和Metropolis-Hastings采样,来推断物理模型的后验概率分布。我们将展示如何使用Python库(如`emcee`或`pymc3`)来实现这些MCMC算法,从而对实验数据进行建模和参数估计,并量化不确定性。 此外,本书还将涵盖数据分析和拟合技术。您将学习如何使用SciPy的优化模块(如`optimize.curve_fit`)来拟合实验数据,并利用统计学方法(如卡方检验、最大似然估计)来评估模型的优劣。我们将讨论如何进行数据可视化,以更清晰地理解数据和模型之间的关系。 提升计算效率的Pythonic之道 高效计算并非仅仅是选择正确的算法,更在于如何巧妙地利用Python语言的特性和其丰富的生态系统。 本书将深入讲解NumPy的向量化操作。您将理解为什么显式的Python循环往往比NumPy的内置函数慢很多,并学会如何将物理计算中的循环操作转化为高效的数组运算。我们将通过具体的物理例子,如矩阵乘法在坐标变换中的应用、数组切片和广播机制在物理量计算中的运用,来展示向量化的威力。 JIT(Just-In-Time)编译是提升Python代码执行速度的关键技术之一。本书将介绍Numba库,它能够将Python和NumPy代码编译成机器码,从而获得接近C/C++的执行速度。您将学习如何使用Numba的装饰器来加速那些计算密集型的函数,例如数值积分、粒子间力的计算,以及图像处理等。 对于并行计算,本书将介绍多线程(threading)和多进程(multiprocessing)的应用。您将了解它们在处理I/O密集型和CPU密集型任务时的不同适用场景,并通过实例演示如何并行化一些物理计算任务,例如批量模拟或数据预处理。 更进一步,本书还将触及GPU计算。我们将介绍CuPy等库,它提供了与NumPy类似的API,但能在NVIDIA GPU上执行计算,从而实现数量级的加速。您将了解如何将一些适合GPU并行化的物理计算任务迁移到GPU上,例如大规模矩阵运算或图像处理。 结语:开启您的高效科学计算之旅 Python物理学高效计算 旨在赋能每一位物理学研究者,无论您是初涉数值计算的学生,还是经验丰富的科研人员。我们相信,通过掌握这些高效的计算方法和Python的强大工具,您将能够: 更快速地原型设计和验证物理模型:将您的理论想法迅速转化为可执行的代码,并获得初步的计算结果。 深入分析复杂物理现象:利用数值模拟捕捉那些难以通过解析方法获得洞察的物理过程。 更有效地处理和分析实验数据:从海量数据中提取有意义的物理信息,并进行精确的参数估计。 提升研究效率,节省宝贵的计算资源:通过优化算法和代码,在更短的时间内完成更具挑战性的计算任务。 站在科学计算的最前沿:掌握最先进的数值技术,为您的科学研究注入新的活力。 本书不仅仅是一本技术手册,更是一种思维方式的引导。它鼓励您积极探索,勇于实践,将计算的力量真正融入您的科学研究体系之中。让我们一起,拨开计算的迷雾,拥抱更深邃的科学洞察,用Python点亮物理学的无限可能。