科学配方
越来越多的期刊要求发表的科学研究必须是可重复的。理想情况下,如果您发布了您的代码,这应该足以让其他人重现您所声明的结果。但是,任何从事过实际计算科学的人都知道这不是真的。您为了测试不同的假设而调整代码片段的次数,或者您用来测试代码并进行实际分析的特定数据片段,都会随着您研究计划的进行呈指数增长。随着时间的推移,跟踪所有这些变化和变动变得非常困难。
由于越来越多的科学工作正在使用 Python 完成,因此出现了一种新工具来帮助自动化记录您的研究程序。Recipy 是一个新的 Python 模块,您可以在代码开发中使用它来管理所述代码开发的历史记录。
Recipy 存在于 Python 模块仓库中,因此安装可以非常简单,只需
pip install recipy
代码位于 GitHub 仓库中,因此您始终可以通过克隆仓库并手动安装来获取最新版本。如果您决定手动安装,您还可以使用 recipy 源代码中的文件通过以下命令安装依赖项:
pip install -r requirements.txt
一旦您安装了它,使用它就非常简单。您可以通过在文件顶部添加以下行来修改您的脚本
import recipy
它需要是 Python 代码执行的第一行,以便捕获程序中发生的所有其他事情。如果您甚至不想过多地修改文件,您可以使用以下命令通过 Recipy 运行代码
python -m recipy my_script.py
所有报告数据都存储在 TinyDB 数据库中,文件名为 test.npy。
一旦您收集了代码的详细信息,您现在就可以开始使用存储在 test.npy 文件中的结果。为了探索这个模块,让我们使用 recipy 文档中的示例代码。一个简短的示例如下,保存在文件 my_script.py 中
import recipy
import numpy
arr = numpy.arange(10)
arr = arr + 500
numpy.save('test.npy', arr)
recipy 模块包含一个名为 recipy 的脚本,可以处理存储的数据。作为初次查看,您可以使用以下命令,这将拉取有关运行的详细信息
recipy search test.npy
在我的 Cygwin 机器上(Linux 用户被迫使用 Windows 机器的强大工具),结果如下所示
Run ID: eb4de53f-d90c-4451-8e35-d765cb82d4f9
Created by berna_000 on 2015-09-07T02:18:17
Ran /cygdrive/c/Users/berna_000/Dropbox/writing/lj/
↪science/recipy/my_script.py using /usr/bin/python
Git: commit 1149a58066ee6d2b6baa88ba00fd9effcf434689, in
↪repo /cygdrive/c/Users/berna_000/Dropbox/writing,
↪with origin https://github.com/joeybernard/writing.git
Environment: CYGWIN_NT-10.0-2.2.0-0.289-5-3-x86_64-64bit,
↪python 2.7.10 (default, Jun 1 2015, 18:05:38)
Inputs: none
Outputs: /cygdrive/c/Users/berna_000/Dropbox/writing/lj/
↪science/recipy/test.npy
每次运行程序时,都会在 test.npy 文件中添加一个新条目。当您再次运行搜索命令时,您将收到如下消息以告知您
** Previous runs creating this output have been found.
↪Run with --all to show. **
如果使用文本界面不是您的菜,那么可以使用以下命令获得 GUI,它可以为您提供可能更友好的界面(图 1)
recipy gui
此 GUI 实际上是基于 Web 的,因此一旦您完成运行此命令,就可以在您选择的浏览器中打开它。

图 1. Recipy 包含一个 GUI,它提供了一种更直观的方式来处理您的运行数据。
Recipy 将其配置和数据库文件存储在目录 ~/.recipy 中。配置存储在此文件夹中的 recipyrc 文件中。默认情况下,数据库文件也位于此处。但是,您可以使用配置选项来更改它
[database] path = /path/to/file.json
这样,您可以将这些数据库文件存储在可以备份并可能进行版本控制的位置。
您可以使用一些不同的配置选项来更改要记录的信息量。在 [general]
部分,您可以使用 debug
选项来包含调试消息,或使用 quiet
选项来不打印任何消息。
默认情况下,围绕 git 命令的所有元数据都包含在记录的信息中。您可以使用配置部分 [ignored metadata]
有选择地忽略其中一些元数据。如果您使用 diff
选项,则不会存储 git diff
命令的输出。相反,如果您想忽略所有内容,则可以使用 git
选项来跳过与 git 命令相关的所有内容。您可以使用配置部分 [ignored inputs]
和 [ignored outputs]
分别忽略记录的输入或输出上的特定模块。例如,如果您想跳过记录来自 numpy 模块的任何输出,您可以使用
[ignored outputs]
numpy
如果您想跳过所有内容,您可以为任一部分使用特殊的 all
选项。如果这些选项存储在上面提到的主配置文件中,它将应用于您的所有 recipy 运行。如果您想为不同的项目使用不同的选项,您可以在当前目录中使用名为 .recipyrc 的文件,其中包含项目的特定选项。
recipy 的工作方式是它与 Python 系统集成以导入模块。它通过在您要记录的模块周围使用包装类来实现这一点。目前,支持的模块有 numpy、scikit-learn、pandas、scikit-image、matplotlib、pillow、GDAL 和 nibabel。
但是,包装器函数非常简单,因此为您的首选科学模块添加包装器很容易。您只需实现 PatchSimple 接口并添加您想要记录的输入和输出函数列表。
阅读本文后,您永远不应忘记您是如何获得结果的。您可以配置 recipy 来记录您认为最重要的细节,并能够重做您过去所做的任何计算。可重复研究的技术在未来将变得更加重要,因此这绝对是添加到您的工具箱中的一种方法。鉴于它目前仅为 0.1.0 版本,因此非常值得关注这个项目,看看它是如何成熟的以及未来会添加哪些新功能。