作家
登录

如何让Python像Julia一样快地运行

作者: 来源: 2017-05-22 13:13:15 阅读 我要评论

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 函数的一段简单编码。

  1. def fib(n): 
  2.  
  3.    if n<2: 
  4.  
  5.        return n 
  6.  
  7.    return fib(n-1)+fib(n-2) 

此函数的值随 n 的增长而快速增长,例如:

  1. fib(100) = 354224848179261915075 

可以留意到,Python 随便率性精度 (arbitrary precision) 很便利。在 C 等说话中编写雷同的函数须要花一些编码工作来避免整数溢出。在 Julia中,须要应用 BigInt 类型。

  1. 0.000080 seconds (149 allocations:10.167 KB) 
  2.  
  3. 0.012717 seconds (262.69 k allocations:4.342 MB) 

在 Python Notebook 中获得运行时光的一种方法是应用神奇的 %timeit。例如,在一个新单位中键入:

  1. %timeit fib(20) 

履行它会获得输出:

  1. 100 loops, best of 3:3.33 ms per loop 

这意味焦急鹞鲼履行了以下操作:

  1. 运行 fib(20) 100 次,存储总运行时光
  2. 运行 fib(20) 100 次,存储总运行时光
  3. 运行 fib(20) 100 次,存储总运行时光
  4. 大年夜 3 次运行中获取最小的运行时光,将它除以 100,然后输出结不雅,该结不雅就是 fib(20) 的最佳运行时光

这些轮回的大年夜小(100 次和 3 次)会由急鹞鲼主动调剂。可能会根据被计时的代码的运行速度来更改轮回大年夜小。

Python 计时与应用了 BigInt 时的 Julia 计时比拟出色得多:3 毫秒与 12 毫秒。在应用随便率性精度时,Python 的速度是 Julia 的 4倍。

然则,Python 比 Julia 默认的 64 位整数要慢。我们看看如安在 Python 中强迫应用 64 位整数。

应用 Cython 编译

一种编译方法是应用 Cython 编译器。这个编译器是应用 Python

编写的。它可以经由过程以下敕令安装:

  1. pip install Cython 
  1. def mandelperf_numba(): 
     1/11    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      云原生安全初创公司Aporeto融资1120万美元

    Aporeto是一家“云原生”的安然始创公司,旨在确保那些不受信的IT情况的安然性。该公司方才在A轮融资——也就是岁尾产品宣布之前——获得了>>>详细阅读


    本文标题:如何让Python像Julia一样快地运行

    地址:http://www.17bianji.com/lsqh/35343.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)