Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Sho Hosoda
6,626 views
Immutable List Gem (KLab ALM版)
関数型スタイルでのクイックソートを高速化した話(Ruby)です。KLab ALM 2014/07/29 で発表しました。
Technology
◦
Read more
4
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 33
2
/ 33
3
/ 33
4
/ 33
5
/ 33
6
/ 33
7
/ 33
8
/ 33
9
/ 33
10
/ 33
11
/ 33
12
/ 33
13
/ 33
14
/ 33
15
/ 33
16
/ 33
17
/ 33
18
/ 33
19
/ 33
20
/ 33
21
/ 33
22
/ 33
23
/ 33
24
/ 33
25
/ 33
26
/ 33
27
/ 33
28
/ 33
29
/ 33
30
/ 33
31
/ 33
32
/ 33
33
/ 33
More Related Content
PDF
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
by
Computational Materials Science Initiative
PDF
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
by
Satoshi imai
PDF
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
by
洋史 東平
PDF
二階堂愛と二階堂藍の違いについて
by
show you
PDF
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
by
Shuyo Nakatani
PDF
Lisp meetup #29 cl-online-learningの紹介
by
Satoshi imai
PDF
Tokyo.R #22 LT
by
Masayuki Isobe
PDF
深層学習フレームワークChainerの紹介とFPGAへの期待
by
Seiya Tokui
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
by
Computational Materials Science Initiative
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
by
Satoshi imai
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
by
洋史 東平
二階堂愛と二階堂藍の違いについて
by
show you
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
by
Shuyo Nakatani
Lisp meetup #29 cl-online-learningの紹介
by
Satoshi imai
Tokyo.R #22 LT
by
Masayuki Isobe
深層学習フレームワークChainerの紹介とFPGAへの期待
by
Seiya Tokui
What's hot
PPTX
Chainer Meetup LT (Alpaca)
by
Jun-ya Norimatsu
PDF
PythonistaがOCamlを実用する方法
by
Yosuke Onoue
PDF
Numpy scipy matplotlibの紹介
by
Tatsuro Yasukawa
PDF
Lispmeetup #45 Common Lispで音声合成
by
Satoshi imai
PDF
Chainer入門と最近の機能
by
Yuya Unno
PDF
CuPy解説
by
Ryosuke Okuta
PDF
深層学習フレームワークChainerとその進化
by
Yuya Unno
PDF
ICFP2009-いかにして我々は戦ったか
by
ina job
PDF
LT@Chainer Meetup
by
Shunta Saito
Chainer Meetup LT (Alpaca)
by
Jun-ya Norimatsu
PythonistaがOCamlを実用する方法
by
Yosuke Onoue
Numpy scipy matplotlibの紹介
by
Tatsuro Yasukawa
Lispmeetup #45 Common Lispで音声合成
by
Satoshi imai
Chainer入門と最近の機能
by
Yuya Unno
CuPy解説
by
Ryosuke Okuta
深層学習フレームワークChainerとその進化
by
Yuya Unno
ICFP2009-いかにして我々は戦ったか
by
ina job
LT@Chainer Meetup
by
Shunta Saito
Similar to Immutable List Gem (KLab ALM版)
PDF
Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)
by
Sho Hosoda
PPTX
Rustでソートを高速化した話(Shinjuku.rs)
by
MasayukiUrakami1
ODP
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
PPT
Algorithm 速いアルゴリズムを書くための基礎
by
Kenji Otsuka
PDF
アルゴリズム+データ構造勉強会(1)
by
noldor
PDF
Ruby programmer silverの取得に向けて
by
善弘 植木
PDF
Ruby on Rails 入門
by
Yasuko Ohba
PDF
programming camp 2008, introduction of programming, algorithm
by
Hiro Yoshioka
PDF
2015 07-04-ruby rails
by
Hiroshi Oyamada
PDF
GC本読んでJSで偽GC作った
by
to_ueda
PDF
アルゴリズム+データ構造勉強会(5)
by
noldor
PDF
アルゴリズム+データ構造勉強会(4)
by
noldor
PDF
Ruby の String のメソッドについて
by
Tomoya Kawanishi
PDF
定番アルゴリズムを徹底理解!
by
teapipin
PDF
Ruby初級者向けレッスン KOF2015 出張版
by
higaki
PDF
ライフゲーム最後まで作ってみました
by
Keisuke Oohata
PPTX
Ruby講座第二回
by
mitsunaga
PPTX
第3回輪講
by
mh_amako
PDF
アルゴリズム+データ構造勉強会(3)
by
noldor
Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)
by
Sho Hosoda
Rustでソートを高速化した話(Shinjuku.rs)
by
MasayukiUrakami1
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
Algorithm 速いアルゴリズムを書くための基礎
by
Kenji Otsuka
アルゴリズム+データ構造勉強会(1)
by
noldor
Ruby programmer silverの取得に向けて
by
善弘 植木
Ruby on Rails 入門
by
Yasuko Ohba
programming camp 2008, introduction of programming, algorithm
by
Hiro Yoshioka
2015 07-04-ruby rails
by
Hiroshi Oyamada
GC本読んでJSで偽GC作った
by
to_ueda
アルゴリズム+データ構造勉強会(5)
by
noldor
アルゴリズム+データ構造勉強会(4)
by
noldor
Ruby の String のメソッドについて
by
Tomoya Kawanishi
定番アルゴリズムを徹底理解!
by
teapipin
Ruby初級者向けレッスン KOF2015 出張版
by
higaki
ライフゲーム最後まで作ってみました
by
Keisuke Oohata
Ruby講座第二回
by
mitsunaga
第3回輪講
by
mh_amako
アルゴリズム+データ構造勉強会(3)
by
noldor
More from Sho Hosoda
PDF
three.js の紹介
by
Sho Hosoda
PDF
シェーダだけで世界を創る!three.jsによるレイマーチング
by
Sho Hosoda
PDF
Twitter名刺ジェネレータ
by
Sho Hosoda
PDF
Twincal
by
Sho Hosoda
PDF
TwinCal(学生のためのアプリ開発コンテストVer.)
by
Sho Hosoda
PDF
カメラで商品検索
by
Sho Hosoda
PDF
Hanamaru Renderer for レイトレ合宿5‽
by
Sho Hosoda
three.js の紹介
by
Sho Hosoda
シェーダだけで世界を創る!three.jsによるレイマーチング
by
Sho Hosoda
Twitter名刺ジェネレータ
by
Sho Hosoda
Twincal
by
Sho Hosoda
TwinCal(学生のためのアプリ開発コンテストVer.)
by
Sho Hosoda
カメラで商品検索
by
Sho Hosoda
Hanamaru Renderer for レイトレ合宿5‽
by
Sho Hosoda
Immutable List Gem (KLab ALM版)
1.
Immutable List Gem 2014/07/29
KLab 社内勉強会 ALM 細田 翔 (@gam0022)
2.
自己紹介 細田 翔 筑波大学情報学群情報科学類 B4 -
非数値処理アルゴリズム研究室 15卒 KLab内定者 Twitter: @gam0022 http://gam0022.net/ 2
3.
話す内容 関数型スタイルでのクイックソートを高速化した話(Ruby) 3
4.
クイックソート 念のためにおさらい クイックソートの基本的な考え - データを軸要素(ピボット)より 大きい要素・小さい要素で分割 することを再帰的に繰り返して ソートを行なう 4 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html
5.
Rubyでクイックソート 手続き型スタイルで実装した場合 特徴 1. コードが長い (tempなどの変数が必要) 2. 昇順降順の切り替えに2箇所の変更 3.
動作が追いにくい 5
6.
OCamlでクイックソート OCaml (関数型言語)による実装 特徴 1. 5行で書ける! 2.
昇順降順の切り替えは1箇所の変更 3. 動作が追いやすい 6
7.
Ruby vs OCaml Ruby
vs OCaml - OCaml の圧倒的な勝利 Ruby でも OCaml のよう なクイックソートを書きたい! 7 Ruby OCaml 行数 29 5 昇順降順の 変更箇所 2 1 可読性 △ ○
8.
Ruby でクイックソート その2 OCaml
Ruby 左: OCamlの5行のコードを List.partition を使わないで再実装 右: 左のコードを Ruby に移植したコード Ruby でも関数型スタイルにプログラミングできた! 8
9.
だが待って欲しい!
10.
Ruby でクイックソートその2 このコードは確かに動作する 問題点 - Array#+
や Array#drop は非破 壊的メソッド - Array のインスタンスを大量に生成 - Array を何度もコピー 10
11.
処理コストが大きい!
12.
データ構造を見直す 関数型スタイルのプログラミングには、Array(配列)は適さない データ構造から見なおしてみる (Immutable) Singly Linked
List が最適 - イミュータブルな単方向連結リスト - OCaml や Lisp の List にも使われる 12
13.
Immutable Singly Linked
List を実装 普通に Ruby で実装してもネタとして面白くない Array は組み込みクラスであり、C言語で実装されているので、 普通にRubyで実装してもパフォーマンス的にも勝ち目がない 「C拡張」として、実装しよう! 13
14.
Ruby の C拡張 C拡張 -
C言語で書いたコードをリンクして Ruby から利用する仕組み 部分的な処理の高速化・ラッパーライブラリなどに使われる 例:C拡張を利用した gem - スクレイピングライブラリの nokogiri - SQlite3 のラッパーライブラリの sqlite3 14
15.
ImmutableList の実装 クラス名は ImmutableList struct
immutable_list の定義 (Cの構造体をラップ) 15
16.
ImmutableList の実装 OCaml を意識したメソッドを実装 -
cons - head, tail - rev_append, rev, append - length - nth - inspect 16
17.
ImmutableList の実装 cons (先頭への要素追加)
の定義 17
18.
ImmutableList の実装 全部で200行くらいで実装できた 罠が多くて苦労した - 明示的にオブジェクトをmarkしないと
GC で勝手にオブジェ クトが開放されて SEGV が発生したりとハマりどころが多い - Ruby 処理系の勉強にはすごくなった 18
19.
Ruby でクイックソート その3 ImmutableList
を使用して再実装 19
20.
Ruby でクイックソート 考察 全く同じ処理 クラスを置き換えただけ 性能に違いが出るか? 20 Array
ImmutableList Array ImmutableList first head drop(1) tail [i]+a a.cons(i)
21.
ベンチマーク データの長さn と 処理時間(CPU時間)
の関係を調査 ソートデータ: 重複のないランダムなデータを使用 最新の Ruby 2.1.2 を使用 21
22.
結果 22 リストの長さのクイックソートの実行時間 実行時間[sec] 0 0.1 0.2 0.3 0.4 リストの長さ[個] 0 2000 4000
6000 8000 Array ImmutableList リストの長さに比例して、ImmutableList が高速になる 最大で4.3倍の高速化!
23.
まとめ 処理によっては、再帰を用いた関数型スタイルでプログラミン グすることで、シンプルに実装できる場合がある パフォーマンス的には、Ruby の Array
は関数型スタイルには 適していない C拡張として実装した ImmutableList によって、関数型スタ イルでのクイックソートを高速化することができた! 23
24.
RubyGems に公開中 RubyGems は
Ruby ライブラリの管理システム immutable_list の名前で登録済みなので、コマンド一発で導入可能 24
25.
ご静聴ありがとうございました
26.
おまけ 本当にC拡張で作った意味があったので疑問だったので、Ruby でも同じ機能を持つクラスを実装した ソースコードはC実装の1/3くらいになった(Rubyの生産性す ごい) 次のベンチマークをとった - 先ほどのクイックソート - 単純な連結(append)処理 26
27.
ImmutableListのRuby実装と比較 Ruby で実装した ImmutableList(Ruby) 手続き型スタイルのクイックソート
Procedural 27 リストの長さとクイックソートの実行時間 実行時間[sec] 0 0.1 0.2 0.3 0.4 リストの長さ[個] 0 2000 4000 6000 8000 Array ImmutableList ImmutableList(Ruby) Procedural C拡張版の方が少し高速
28.
ImmutableListのRuby実装と比較 連結の回数と実行時間(対数グラフ) 実行時間[sec] 0.01 0.1 1 10 100 連結回数[回] 1000 10000 100000 Array
ImmutableList ImmutableList(Ruby) 長さ6のリストをn回連結 28
29.
ImmutableListのRuby実装と比較 C拡張版の方が高速で良かった でも、思ったよりは変わらなくて残念(́・ω・`) 関数型スタイルは手続き型スタイルよりすごく遅い 29
30.
Immutable List が
Array より メモリの消費が少ない説明
31.
Arrayの連結 C = A+B
を行なった時、AとBの内容を全てコピーする 1 2 3 4 5 6 7 8+ A B 1 2 3 4 5 6 7 8 A B 1 2 3 4 5 6 7 8 C
32.
Immutable Singly Linked
List の連結 C = A+B を行なった時、Bとの差分だけがコピーされる 1 2 3 4 5 6 7 8+ A B 1 2 3 A 1 2 3 C 4 5 6 7 8 B
33.
head と tail 次の操作は参照を返すだけなので、とても高速 -
head: 先頭の要素の取り出し Array#first に対応 - tail: 2番目以降のリストの取り出し Array#drop に対応 33 1 2 3 4 5 6 7 8 tail head
Download