Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PythonユーザによるRust入門
Search
MIZUTANI RYOTA
June 02, 2022
Programming
16
7.4k
PythonユーザによるRust入門
社内勉強会で使用した資料です。PythonユーザがRustに入門する際に必要となる知識やつまづきやすいポイントを記載しています。
MIZUTANI RYOTA
June 02, 2022
Tweet
Share
More Decks by MIZUTANI RYOTA
See All by MIZUTANI RYOTA
言語モデルにおける推論パラメータと小説生成への適用について
rmizuta3
0
490
プロテニスにおいて疲れが勝敗に与える影響を定量化してみる
rmizuta3
2
1.1k
Other Decks in Programming
See All in Programming
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
780
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
240
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
760
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
190
useSyncExternalStoreを使いまくる
ssssota
6
1k
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
210
fs2-io を試してたらバグを見つけて直した話
chencmd
0
230
MCP with Cloudflare Workers
yusukebe
2
220
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
130
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
330
Jakarta EE meets AI
ivargrimstad
0
250
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
360
Featured
See All Featured
Navigating Team Friction
lara
183
15k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Optimizing for Happiness
mojombo
376
70k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
The Invisible Side of Design
smashingmag
298
50k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Designing for humans not robots
tammielis
250
25k
A Philosophy of Restraint
colly
203
16k
Why Our Code Smells
bkeepers
PRO
335
57k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
KATA
mclloyd
29
14k
Transcript
水谷 亮太 株式会社 Mobility Technologies PythonユーザによるRust 入門
2 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
3 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
▪ なぜRustをやってみようと思ったのか? ▪ 現状まともにかける言語はPythonのみ。最もよく使うのはJupyter ▪ AHC(Atcoder Heuristic Contest)を最近やっているが、探索数が重要 となる問題の場合、Pythonでは計算時間上明らかな不利が生じる。 ▪
ここ5年くらいほぼPythonしか触ってないので別の言語を試してみた い。 ▪ C++かRustか迷ったがRustの方が面白そう ▪ 次項からRustの説明をしますが、かなり抜粋した内容となっ ていますので、詳細は以下の参考文献を参照いただければと 思います。 ▪ 公式ドキュメント(日本語) ▪ 実践Rustプログラミング入門 4 はじめに
▪ 2015年に正式リリースされたプログラミング言語 ▪ 言語の特徴 ▪ 速度が早い ▪ 信頼性が高い ▪ 多くのバグをコンパイル時に排除できる
▪ ツール群が充実している ▪ 多数のエディタに対応するスマートな自動補完と型検査機能、自動 フォーマッタ等々 5 Rustとは
Python Rust 速度 ✕ ◯ 書きやすさ ◯ △ 保守性・システム安全性 ✕
◯ ライブラリ ◯ △ ▪ Rustが優位なケース ▪ 運用が必要となるシステム開 発 ▪ 速度が重要となる場合 ▪ Pythonが優位なケース ▪ 分析用コード等再利用や改修をを 考慮しない場合 ▪ 機械学習系のライブラリを利用し たい場合 6 Rust vs Python
PythonとRustに共通する機能 ▪ 変数、データ型、関数、for文、etc… ➢ 対応する書き方を覚えればよい。 PythonになくRustにある機能 ▪ コンパイル ▪ メモリ管理、ガベージコレクション
➢ 新たな概念を覚える必要がある。 7 PythonとRustの差分について
8 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
▪ 変数の定義 ▪ Rustは要型指定(殆どの場合型推論される)。 ▪ Rustは基本immutable。後で変更する可能性がある変数にはmutが必要。 Python Rust 整数 int
i8, i16, i32, i64, i128, isize 浮動小数点 float f32, f64 文字列 str String, &str, char Python Rust 9 変数定義について
▪ list Python Rust • 上の書き方だとリスト内の要素数が変更できないので、要素の追加や削除が必要な場 合はベクタ型を使う。 10 List型
▪ dict Python Rust 11 DIct型
▪ if文、for文、while文の例 Python Rust 12 if, for, while
13 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
Pythonはインタープリタ言語、Rustはコンパイラ言語。 ▪ インタープリタ言語 ▪ コードを逐次機械語に翻訳して実行 ▪ メリット ▪ 部分的なコード実行が可能 ▪
デメリット ▪ 速度が遅い ▪ コンパイラ言語 ▪ 全てのコードを一度に機械語に翻訳し、その後実行。 ▪ メリット ▪ 速度が早い ▪ デメリット ▪ コードに実行にコンパイルという処理が必要 14 コンパイルについて
▪ Rustのコンパイル時には最適化レベルが存在する ▪ cargo run(実行コマンド)を実行したとき ▪ opt-level = 0 ▪
コンパイルは早くデバッグ情報が有効化される。最適化は行われない。 ▪ cargo run –releaseを実行したとき ▪ opt-level = 3 ▪ コンパイルは遅くデバッグ情報は無効化される。最適化が行われる。 ➢ Rustの速度は–releaseオプションがついて初めて発揮され る。 15 Rustのコンパイラレベルについて
▪ 大抵の言語ではガベージコレクションによってメモリ領域のう ち、不要になった領域を解放している。例えばPythonだと明示 的にクリアすることでガベージコレクションが行われる。 ▪ このような仕組みだと下記の事象が発生する。 ▪ メモリ領域を必要以上に使う ▪ メモリ領域の解放時に計算が止まる
▪ Rustはガベージコレクションをもたない。下記の仕組みによりガ ベージコレクションなしでメモリ管理が可能となっている。 ▪ 所有権 ▪ 借用 16 メモリ管理について
name value ptr len 5 capacity 5 index value 0
h 1 e 2 l 3 l 4 o s1 17 所有権について
name value ptr len 5 capacity 5 index value 0
h 1 e 2 l 3 l 4 o s1 18 所有権について name value ptr len 5 capacity 5 s2
name value ptr len 5 capacity 5 index value 0
h 1 e 2 l 3 l 4 o name value ptr len 5 capacity 5 a b aとbの参照先が同一のため、片方で値を変更 するともう一方にも影響が出る。 19 Pythonだとまれによくある誤操作
▪ 所有権の概念があるため、関数に変数を渡すだけで元の 値が使えなくなる。 ここでs1の所有権が移ってしまうため、 標準出力でs1が使用できなくなる。 20 借用と参照について
▪ 前述のケースを防ぐために変数に&をつけて参照を渡すという方法 がとれるようになっている。関数の引数に参照を取ることを借用と いう。 name value ptr len 5 capacity
5 index value 0 h 1 e 2 l 3 l 4 o s1 name value ptr s 21 借用と参照について
▪ 四則演算を行う際、型が違うとコンパイルエラーになる。下記のようにi32 とi64でもエラーになるので、Pythonと同じ意識でやっていると多くのエ ラーを出すことになる。 ▪ 配列にアクセスできる型はusizeのみ。下記のように配列の任意の箇所にア クセスしたい場合、その方をusizeに変更する必要がある。 22 つまづきやすいポイント(型について)
▪ Pythonではstr型一つだが、RustではString型と&str型、char型がある。 ▪ String: 可変長の文字列 ▪ &str: 固定長の文字列。文字列リテラル ▪ char:
一文字を表す ▪ 結合したいときはString + &strとする必要がある。 23 つまづきやすいポイント(文字列の扱いについて)
▪ “dog”と”cat”の2つの文字列から、先頭の文字から交互に合成し た”dcoagt”という文字列を生成したい場合 Python Rust 24 つまづきやすいポイント(文字列の扱いについて)
25 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
▪ PyO3はRust製ライブラリのPythonバインディング作成用のライブラリ ▪ Rustで作った関数をPythonから呼び出せるようになる ▪ 使い方 ▪ 専用のフォルダを作成しmaturin initを実行 ▪
lib.rsというファイルが生成されるので、そこで呼び出される関数を作成 ▪ maturin develop –releaseを実行するとpythonから読み込めるモジュールが生成され る ※--releaseをつけないと本来の速度が出ない ▪ 生成されたモジュールをpythonでimportして使用する。 ▪ 詳細は公式参照 26 PyO3とは
lib.rsの例 Pythonの実行ファイル 27 PyO3の利用例
▪ 問題設定 ▪ 初期点を100個ランダムに生成し、初期経路もランダムに生成する。 ▪ 2つの辺をランダムに組み替え、経路長が小さくなれば採用する焼きなまし (2-opt)を2秒間行い、結果をPythonと焼きなましの部分のみPyO3(Rust)を 使用した結果を比較 ▪ 使用コード
初期点 初期解 改善解 28 PyO3で巡回セールスマン問題を解く
▪ 実験を10回試行した平均値 ▪ 同じ時間でPyO3だとPythonの100倍以上(!?)試行が回せ、最終的な経路長 もその分短くできている。 ▪ 極力同じようなコードになるよう心がけたが、おそらくPythonに不利な書 き方になっている可能性がある。でも10倍くらいは速度の違いが出ること が多い印象。 PyO3(Rust)
Python 最終経路長 13,207 17,007 試行回数 9,891,702 83,939 29 実験結果
30 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う
5. まとめ
▪ まとめ ▪ Rustの基本的な仕組み、及びPythonユーザがRustを学ぶ際の差分やつまづきや すいポイントを紹介した。 ▪ RustとPythonの速度比較を実験し、RustはPythonに比べかなり高速にプログラ ムの実行が可能であることを示した。 ▪ 感想
▪ Rustはwebの情報がかなり充実していてかなり学びやすかった。入力補助ツール Rust-analyzerは非常に使いやすいし、例題として競技プログラミングの問題を 解くことを繰り返すだけで一定レベルまでは書けるようになったと思う。 ▪ 低レイヤの知識が必要なプログラミング言語を学ぶことで、Pythonを使用して いる時に言語側に任せていること(メモリ管理や型推論)が意識できてよかった。 31 まとめと感想