Julia 与 Python 的比较
我是否应丢弃 Python 和其他说话,应用 Julia 履行技妙策算?在看到 http://julialang.org/ 上的基准测试后,人们必定会这么想。Python和其他高等说话在速度上远远有些落后。然则,我想到的第一个问题有所不合:Julia 团队可否以最合适 Python 的方法编写 Python 基准测试?
我对这种跨说话比较的不雅点是,应当根据要履行的义务来定义基准测试,然后由说话专家编写履行这些义务的最佳代码。如不雅代码全由一个说话团队编写,则存在其他说话未获得最佳应用的风险。
Julia 团队有一件事做得对,那就是他们将他们应用的代码宣布到了 github 上。具体地讲,Python 代码可在此处找到。
第一眼看到该代码,就可以证实我所害怕的成见。该代码是以 C 风格编写的,在数组和列表上大年夜量应用了轮回。这不是应用 Python 的最佳方法。
我不会责备 Julia 团队,因为我很腼腆本身也有同样的成见。但我受到了残暴的教训:付出任何价值都要避免数组或列表上的轮回,因为它们确切会拖慢 Python中的速度,请参阅《Python 不是 C》。
推敲到对 C 风格的┞封种成见,一个有趣的问题(至少对我而言)是,我们可否改进这些基准测试,更好地应用 Python 及其对象?
在我给出谜底之前,我想说我毫不会试图贬低 Julia。在进一步开辟和改进后,Julia 无疑是一种值得存眷的说话。我只是想分析 Python方面的工作。实际上,我正在以此为饰辞来摸索各类可用于让代码更快运行的 Python 对象。
鄙人面的内容中,我应用 Docker 镜像在 Jupyter Notebook 中应用 Python 3.4.3,个中已安装了所有的 Python 科学对象组合。我还会经由过程Windows 机械上的 Python 2.7.10,应用 Anaconda 来运行代码。计时是对 Python 3.4.3 履行的。包含下面的所有基准测试的完全代码的 Notebook 可在此处(https://www.ibm.com/developerworks/community/blogs/jfp/resource/julia_python.zip)找到。
鉴于各类社交媒体上的评论,我添加了如许一句话:我没有在这里应用 Python 的替代性实现。我没有编写任何 C代码:如不雅您不信,可尝尝寻找分号。本文中应用的所有对象都是 Anaconda 或其他发行版中供给的标准的 Cython 实现。下面的所有代码都在单个 Notebook中运行。
我测验测验过应用来自 github 的 Julia 微机能文件,但不克不及应用 Julia 0.4.2 原封不动地运行它。我必须编辑它并将 @timeit 调换为@time,它才能运行。在对它们计时之前,我还必须添加对计时函数的调用,不然编译时光也将包含在内。我应用的文件位于此处。我在用于运行 Python 的同一个机械上应用 Julia 敕令行接口运行它。
计时代码
Julia 团队应用的第一项基准测试是 Fibonacci 函数的一段简单编码。
- def fib(n):
- if n<2:
- return n
- return fib(n-1)+fib(n-2)
此函数的值随 n 的增长而快速增长,例如:
- fib(100) = 354224848179261915075
可以留意到,Python 随便率性精度 (arbitrary precision) 很便利。在 C 等说话中编写雷同的函数须要花一些编码工作来避免整数溢出。在 Julia中,须要应用 BigInt 类型。
- 0.000080 seconds (149 allocations:10.167 KB)
- 0.012717 seconds (262.69 k allocations:4.342 MB)
在 Python Notebook 中获得运行时光的一种方法是应用神奇的 %timeit。例如,在一个新单位中键入:
- %timeit fib(20)
履行它会获得输出:
- 100 loops, best of 3:3.33 ms per loop
这意味焦急鹞鲼履行了以下操作:
- 运行 fib(20) 100 次,存储总运行时光
- 运行 fib(20) 100 次,存储总运行时光
- 运行 fib(20) 100 次,存储总运行时光
- 大年夜 3 次运行中获取最小的运行时光,将它除以 100,然后输出结不雅,该结不雅就是 fib(20) 的最佳运行时光
这些轮回的大年夜小(100 次和 3 次)会由急鹞鲼主动调剂。可能会根据被计时的代码的运行速度来更改轮回大年夜小。
Python 计时与应用了 BigInt 时的 Julia 计时比拟出色得多:3 毫秒与 12 毫秒。在应用随便率性精度时,Python 的速度是 Julia 的 4倍。
然则,Python 比 Julia 默认的 64 位整数要慢。我们看看如安在 Python 中强迫应用 64 位整数。
应用 Cython 编译
一种编译方法是应用 Cython 编译器。这个编译器是应用 Python
编写的。它可以经由过程以下敕令安装:
- pip install Cython