加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

为什么Julia比Python快?因为天生理念就更先进啊

发布时间:2019-02-27 04:53:21 所属栏目:优化 来源:机器之心编译
导读:副标题#e# 其实像以前 C 或其它主流语言在使用变量前先要声明变量的具体类型,而 Python 并不需要,赋值什么数据,变量就是什么类型。然而没想到正是这种类型稳定性,让 Julia 相比 Python 有更好的性能。 选择 Julia 的最主要原因:要比其他脚本语言快得多

当我们没有类型稳定性时会发生什么呢?我们来看看这段代码:

  1. @code_native ^(2,5) 
  2.  
  3.     .text 
  4. ; Function ^ { 
  5. ; Location: intfuncs.jl:220 
  6.     pushq   %rax 
  7.     movabsq $power_by_squaring, %rax 
  8.     callq   *%rax 
  9.     popq    %rcx 
  10.     retq 
  11.     nop 
  12. ;} 

现在让我们定义对整数的取幂,让它像其他脚本语言中看到的那样「安全」:

  1. function expo(x,y) 
  2.     if y>0 
  3.         return x^y 
  4.     else 
  5.         x = convert(Float64,x) 
  6.         return x^y 
  7.     end 
  8. end 

output: expo (generic function with 1 method)

确保它有效:

  1. println(expo(2,5)) 
  2. expo(2,-5) 

output: 32

0.03125

当我们检查这段代码时会发生什么?

  1. @code_native expo(2,5) 
  2.  
  3.  
  4.  
  5. .text 
  6. ; Function expo { 
  7. ; Location: In[8]:2 
  8.     pushq   %rbx 
  9.     movq    %rdi, %rbx 
  10. ; Function >; { 
  11. ; Location: operators.jl:286 
  12. ; Function <; { 
  13. ; Location: int.jl:49 
  14.     testq   %rdx, %rdx 
  15. ;}} 
  16.     jle L36 
  17. ; Location: In[8]:3 
  18. ; Function ^; { 
  19. ; Location: intfuncs.jl:220 
  20.     movabsq $power_by_squaring, %rax 
  21.     movq    %rsi, %rdi 
  22.     movq    %rdx, %rsi 
  23.     callq   *%rax 
  24. ;} 
  25.     movq    %rax, (%rbx) 
  26.     movb    $2, %dl 
  27.     xorl    %eax, %eax 
  28.     popq    %rbx 
  29.     retq 
  30. ; Location: In[8]:5 
  31. ; Function convert; { 
  32. ; Location: number.jl:7 
  33. ; Function Type; { 
  34. ; Location: float.jl:60 
  35. L36: 
  36.     vcvtsi2sdq  %rsi, %xmm0, %xmm0 
  37. ;}} 
  38. ; Location: In[8]:6 
  39. ; Function ^; { 
  40. ; Location: math.jl:780 
  41. ; Function Type; { 
  42. ; Location: float.jl:60 
  43.     vcvtsi2sdq  %rdx, %xmm1, %xmm1 
  44.     movabsq $__pow, %rax 
  45. ;} 
  46.     callq   *%rax 
  47. ;} 
  48.     vmovsd  %xmm0, (%rbx) 
  49.     movb    $1, %dl 
  50.     xorl    %eax, %eax 
  51. ; Location: In[8]:3 
  52.     popq    %rbx 
  53.     retq 
  54.     nopw    %cs:(%rax,%rax) 
  55. ;} 

这个演示非常直观地说明了为什么 Julia 使用类型推断来实现能够比其他脚本语言有更高的性能。

核心观念:多重分派+类型稳定性 => 速度+可读性

类型稳定性(Type stability)是将 Julia 语言与其他脚本语言区分开的一个重要特征。实际上,Julia 的核心观念如下所示:

(引用)多重分派(Multiple dispatch)允许语言将函数调用分派到类型稳定的函数。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!