在浏览器中用Python做数据科学:Pyodide
Pyodide 是Mozilla的一个实验性项目,用于创建一个完全在浏览器中运行的完整的Python数据科学技术栈。
Pyodide的动机来自于Mozilla的另一个项目 Iodide的工作,在早先的一个博客中我们介绍了它。Iodide是一个基于最新Web技术的用于数据科学实验和交流的工具。值得注意的是,它被设计来在浏览器中而不是在远程内核中执行数据科学计算。
不幸的是,我们在浏览器中所用的语言,JavaScript,没有一个成熟的数据科学库。并且它缺失了一些对于数值计算很有用的特性,比如操作符重载。我们仍然认为致力于改变改状况并将JavaScript数据科学生态向前推进是值得的。同时,我们也在选取一个捷径: 我们通过将流行的成熟的Python科学技术栈带入浏览器领域来满足数据科学家。
广泛被争论的就是Python不在浏览器中运行是对该语言的存在的威胁—现在如此多用户交互发生在Web或者移动设备上,它需要也能在上面工作否则就会落后。因此,尽管Pyodide试图要首先满足Iodide,它仍然被设计为也可作为独立体使用。
Pyodide带给你一个完全运行在浏览器中的完整的,标准的Python解释器,并具有完整的访问浏览器的Web APIs的能力。在上面的例子中(50MB下载),对加利福利亚奥克兰城当地信息服务中心“311”的访问密度进行了3D作图。数据加载和处理在Python中执行,然后将其递交给Javascript和WebGL来绘图。
另外一个快速示例是,下面有一个简单的小脚本可以让你在浏览器窗口中进行绘画。
下面就是它看起来的样子:
最好的了解Pyodide可以做什么的方式就是直接去尝试它!这里有一个演示notebook (50MB 下载),其概括了一些高级特征。这篇博客的剩余部分将更多的是对Pyodide如何工作的深入的技术研究。
现有技术
当我们启动Pyodide项目的时候,已经有一些令人印象深刻的项目将Python带到浏览器的世界。不幸的是,还没有任何一个项目致力于实现具有完整功能特性的主流数据科学技术栈(支持 NumPy,Pandas, Scipy, 和Matplotlib),而那正是我们的目标。
诸如 Transcrypt这样的项目将Python转换为JavaScript。由于转换编译这个步骤发生在Python上, 你要么需要提前完成所有的转译工作要么需要与一个服务器交互来完成该工作。这不能真正地满足我们让用户能够在没有外界帮助的情况下在浏览器中编写Python并运行的目标。
像 Brython 和Skulpt 这样的项目是用JavaScript重写了标准的Python解释器,因此,你能够直接在浏览器中运行Python代码。不幸的是,由于它们是由JavaScript启动的完全的新的Python的实现,其不能够与用C写的Python扩展兼容,比如 NumPy 和Pandas。因此,没有数据科学工具。
PyPyJs是在浏览器中JIT编译Python的实现 PyPy的一个可替代品,其使用emscripten。它有潜力能够非常迅速地运行Python代码,原因和PyPy一样。不幸的是,它也像PyPy一样有无法执行C扩展 的问题。所有这些方式使得我们要去重写科学计算工具来获得足够的性能。作为一个经常使用Matplotlib的人,我知道那将占据多少数不清的个人时间:其它的项目已经进行过尝试并停滞不前,而且肯定是会带来许多我们这样的杂凑的创业团队无法处理的工作量。我们因此需要构建一个尽可能地接近标准Python实现的工具,以及大多数据科学家已经使用的科学计算技术栈。
在与Mozilla的WebAssembly 团队交谈之后,我们发现构建的关键是 emscripten 和WebAssembly: 用于将向浏览器传送C代码的技术。这导致我们发现了一个已存的但是沉寂的用于emscripten的Python构建, cpython-emscripten,其最终被用作Pyodide的基础。