作家
登录

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

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

  • Function: parse_int at line 1 
  •  
  • Line # Hits Time Per Hit % Time Line Contents 
  •  
  • ============================================================== 
  •  
  • 1 def parse_int(): 
  •  
  • 2 1000 699 0.7 5.1 for i in range(1,1000): 
  •  
  • 3 999 9149 9.2 66.3 n = random.randint(0,2**32-1) 
  •  
  • 4 999 1024 1.0 7.4 s = hex(n) 
  •  
  • 5 999 863 0.9 6.3 if s[-1]=='L'
  •  
  • 6 s = s[0:-1] 
  •  
  • 7 999 1334 1.3 9.7 m = int(s,16) 
  •  
  • 8 999 738 0.7 5.3 assert m == n 
  • 可以看到,大年夜部分时光都花费在了生成随机数上。我不肯定则是不是该基准测试的意图。

    1. from functools import lru_cache as cache 
    2.  
    3. @cache(maxsize=None) 
    4.  
    5. def fib_cache(n): 
    6.  
    7.     if n<2: 
    8.  
    9.         return n 
    10.  
    11.     return fib_cache(n-1)+fib_cache(n-2) 

    加快此测试的一种方法是应用 Numpy 将随机数生成移到轮回之外。我们一次性创建一个随机数数组。

    对它计时会获得:

    1. 1000 loops, best of 3:848 µs per loop 

    还不错,快了 4 倍,接近于 Cython 代码的速度。

    拥稀有组后,经由过程轮回它来一次向某个元素应用 hex() 和 int() 函数似乎很傻。好消息是,Numpy 供给了一种向数组应用函数的办法,而不必使悠揭捉?环,该函数是numpy.vectorize() 函数。此函数接收一次处理一个对象的函数。它返回一个处理数组的新函数。

    1. vhex = np.vectorize(hex) 
    2.  
    3. vint = np.vectorize(int
    4.  
    5. def parse_int_numpy(): 
    6.  
    7.     n = np.random.randint(0,2**32-1,1000) 
    8.  
    9.     s = vhex(n) 
    10.  
    11.     m = vint(s,16) 
    12.  
    13.     np.all(m == n) 
    14.  
    15.     return s 

    此代码运行速度更快了一点,几乎像 Cython 代码一样快:

    1. 1000 loops, best of 3:703 µs per loop 

    我肯定 Python 专家可以或许比我在这里做得更好,因为我不太熟悉 Python 解析,但这再一次注解避免 Python 轮回是个不错的设法主意。

    停止语

    膳绫擎介绍了若何加快 Julia 团队所应用的 4 个示例的运行速度。还有 3 个例子:

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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