Slide 1

Slide 1 text

Juliaでちゃんとしたコードを書く Yoshifumi  Seki   2014.07.05  @Julia  Tokyo  #1

Slide 2

Slide 2 text

 自己紹介 •  関 喜史   •  株式会社Gunosy  共同創業者   •  東京大学大学院博士課程在籍中   •  分析系エンジニア   –  コンテンツ評価/ユーザ行動解析/推薦システム   •  Python  /  GoogleSpreadSheet   •  Julia歴  12時間   •  エディタをカスタマイズできない人だからJulia  Studio使 いたいけど補完が効かないIDEということで辛い…  

Slide 3

Slide 3 text

今日の話 •  初心者です!!!!!!   •  Juliaを使うと分析がマッハに早くなるって聞い てきました!!!!!!   •  でもそんなに早くならないんですがどうしてで すか????  

Slide 4

Slide 4 text

今日の話 •  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  

Slide 5

Slide 5 text

基本的なルール •  グローバル変数使うな!!!!   •  処理はしっかり分けろ!!!   •  ループ内で行列を宣言するな!!!!   •  型を守れ!!!!

Slide 6

Slide 6 text

グローバル変数使うな!!!

Slide 7

Slide 7 text

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最高!!!!

Slide 8

Slide 8 text

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最高!!!!

Slide 9

Slide 9 text

処理はしっかり分けろ!!!  

Slide 10

Slide 10 text

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)

Slide 11

Slide 11 text

ループ内で行列を宣言するな!!!!  

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

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) 関数の返り値を事前に定義しておく

Slide 14

Slide 14 text

型を守れ!!!!

Slide 15

Slide 15 text

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関数は型を維持する   返り値の型は一定にしよう!

Slide 16

Slide 16 text

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になってる   スコープ内で型の定義が変わるコードは書かない

Slide 17

Slide 17 text

まとめ •  一般的な”きれいなコード”によって速度がか なり向上する   – 言語特有のテクニックみたいなのにあんまり依存 しなさそう   •  iJuliaってどうなんでしょう   – メソッドにしっかりわけないと早くならなくてJuliaの 恩恵をあんまり受けられない気がする   – やっぱりかっこいいIDEがほしい!!