Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Juliaでちゃんとしたコードを書く

ysekky
July 05, 2014

 Juliaでちゃんとしたコードを書く

JuliaTokyo #1のLT資料

ysekky

July 05, 2014
Tweet

More Decks by ysekky

Other Decks in Programming

Transcript

  1.  自己紹介 •  関 喜史   •  株式会社Gunosy  共同創業者   • 

    東京大学大学院博士課程在籍中   •  分析系エンジニア   –  コンテンツ評価/ユーザ行動解析/推薦システム   •  Python  /  GoogleSpreadSheet   •  Julia歴  12時間   •  エディタをカスタマイズできない人だからJulia  Studio使 いたいけど補完が効かないIDEということで辛い…  
  2. 今日の話 •  Juliaでコードを簡単にはやくする書くTipsを紹介します   –  特にハマりやすそうで効果が出やすいやつを紹介します   •  それによりどれぐらい早くなるのかを紹介します  

    •  参考資料   –  Julia  Performance  Tips   •  hIp://julia.readthedocs.org/en/latest/manual/performance-­‐Mps/   –  Fast  numeric  computaMon  in  Julia   •  hIp://julialang.org/blog/2013/09/fast-­‐numeric/   –  GitHubのIssueでPerformanceタグがついててコメントが盛 り上がってるやつ   •  hIps://github.com/JuliaLang/julia/issues?labels=performance  
  3. n  =  10^7   s  =  0   for  i=1:n

         s  +=  1   end elapsed  (me:  0.745039091     seconds  (320052788  bytes  allocated) funcMon  foo()      n  =  10^7      s  =  0      for  i=1:n          s  +=  1      end   end elapsed  (me:  0.004676756     seconds  (75632  bytes  allocated) func(on最高!!!!
  4. a  =  1   funcMon  foo()      n  =

     10^7      s  =  0      for  i=1:n          s  +=  a      end   end elapsed  (me:  0.33067648     seconds  (160066648  bytes  allocated) const  b  =  1   funcMon  foo()      n  =  10^7      s  =  0      for  i=1:n          s  +=  b      end   end elapsed  (me:  0.005886063    seconds  (75680  bytes  allocated) const最高!!!!
  5. funcMon  foo(n)      a  =  Array(randbool()  ?  Int64  :

     Float64,  n)      for  i=1:n          a[i]  =  2      end   end elapsed  (me:  4.226609178  seconds    (2400100836  bytes  allocated) funcMon  bar!(a)      for  i=1:length(a)          a[i]  =  2      end   end     funcMon  foo(n)      a  =  Array(randbool()  ?  Int64  :  Float64,  n)      bar!(a)   end elapsed  (me:  0.388700136  seconds    (800163196  bytes  allocated)
  6. funcMon  foo()      c  =  Array(Float64,  10,  10)  

       for  i=0:10^7          rand!(c)      end   end elapsed  (me:  3.288667076   seconds  (93012  bytes  allocated) funcMon  foo()      for  i=0:10^7          c  =  rand(10,  10)      end   end elapsed  (me:  8.586973305  seconds    (8960074648  bytes  allocated)
  7. funcMon  bar(x)          return  [x,  x+1,  x+2]

      end     funcMon  foo()          for  i  =  1:10^7                  a  =  bar(i)          end   end elapsed  (me:  1.453459727  seconds    (1279975568  bytes  allocated) funcMon  bar!{T}(ret::AbstractVector{T},  x::T)      ret[1]  =  x      ret[2]  =  x+1      ret[3]  =  x+2   end     funcMon  foo()      a  =  Array(Int,  3)      for  i  =  1:10^7          bar!(a,  i)      end   elapsed  (me:  0.038737026  seconds    (117992  bytes  allocated) 関数の返り値を事前に定義しておく
  8. pos(x)  =    x  <  0  ?  0  :  x

      funcMon  foo()      for  i=1:10^8          pos(rand()*10-­‐5)      end   end pos(x)  =    x  <  0  ?  zero(x)  :  x   funcMon  foo()      for  i=1:10^8          pos(rand()*10-­‐5)      end   end elapsed  (me:  1.821434959  seconds    (800249296  bytes  allocated) elapsed  (me:  0.437677302  seconds    (102852  bytes  allocated) xがfloatの時返り値がintになってしまう.   zero関数は型を維持する   返り値の型は一定にしよう!
  9. funcMon  foo()      x  =  1      for

     i=1:10^8          x  =  1/0.1      end   end funcMon  foo()      x  =  1.0      for  i=1:10^8          x  =  1/0.1      end   end elapsed  (me:  0.035630704  seconds     (74872  bytes  allocated) elapsed  (me:  1.499462633  seconds   (1600088672  bytes  allocated) 割り算による型変換でintからfloatになってる   スコープ内で型の定義が変わるコードは書かない
  10. まとめ •  一般的な”きれいなコード”によって速度がか なり向上する   – 言語特有のテクニックみたいなのにあんまり依存 しなさそう   •  iJuliaってどうなんでしょう

      – メソッドにしっかりわけないと早くならなくてJuliaの 恩恵をあんまり受けられない気がする   – やっぱりかっこいいIDEがほしい!!