Slide 1

Slide 1 text

水谷 亮太 株式会社 Mobility Technologies PythonユーザによるRust 入門

Slide 2

Slide 2 text

2 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 3

Slide 3 text

3 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 4

Slide 4 text

■ なぜRustをやってみようと思ったのか? ■ 現状まともにかける言語はPythonのみ。最もよく使うのはJupyter ■ AHC(Atcoder Heuristic Contest)を最近やっているが、探索数が重要 となる問題の場合、Pythonでは計算時間上明らかな不利が生じる。 ■ ここ5年くらいほぼPythonしか触ってないので別の言語を試してみた い。 ■ C++かRustか迷ったがRustの方が面白そう ■ 次項からRustの説明をしますが、かなり抜粋した内容となっ ていますので、詳細は以下の参考文献を参照いただければと 思います。 ■ 公式ドキュメント(日本語) ■ 実践Rustプログラミング入門 4 はじめに

Slide 5

Slide 5 text

■ 2015年に正式リリースされたプログラミング言語 ■ 言語の特徴 ■ 速度が早い ■ 信頼性が高い ■ 多くのバグをコンパイル時に排除できる ■ ツール群が充実している ■ 多数のエディタに対応するスマートな自動補完と型検査機能、自動 フォーマッタ等々 5 Rustとは

Slide 6

Slide 6 text

Python Rust 速度 ✕ ◯ 書きやすさ ◯ △ 保守性・システム安全性 ✕ ◯ ライブラリ ◯ △ ■ Rustが優位なケース ■ 運用が必要となるシステム開 発 ■ 速度が重要となる場合 ■ Pythonが優位なケース ■ 分析用コード等再利用や改修をを 考慮しない場合 ■ 機械学習系のライブラリを利用し たい場合 6 Rust vs Python

Slide 7

Slide 7 text

PythonとRustに共通する機能 ■ 変数、データ型、関数、for文、etc… ➢ 対応する書き方を覚えればよい。 PythonになくRustにある機能 ■ コンパイル ■ メモリ管理、ガベージコレクション ➢ 新たな概念を覚える必要がある。 7 PythonとRustの差分について

Slide 8

Slide 8 text

8 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 9

Slide 9 text

■ 変数の定義 ■ Rustは要型指定(殆どの場合型推論される)。 ■ Rustは基本immutable。後で変更する可能性がある変数にはmutが必要。 Python Rust 整数 int i8, i16, i32, i64, i128, isize 浮動小数点 float f32, f64 文字列 str String, &str, char Python Rust 9 変数定義について

Slide 10

Slide 10 text

■ list Python Rust ● 上の書き方だとリスト内の要素数が変更できないので、要素の追加や削除が必要な場 合はベクタ型を使う。 10 List型

Slide 11

Slide 11 text

■ dict Python Rust 11 DIct型

Slide 12

Slide 12 text

■ if文、for文、while文の例 Python Rust 12 if, for, while

Slide 13

Slide 13 text

13 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 14

Slide 14 text

Pythonはインタープリタ言語、Rustはコンパイラ言語。 ■ インタープリタ言語 ■ コードを逐次機械語に翻訳して実行 ■ メリット ■ 部分的なコード実行が可能 ■ デメリット ■ 速度が遅い ■ コンパイラ言語 ■ 全てのコードを一度に機械語に翻訳し、その後実行。 ■ メリット ■ 速度が早い ■ デメリット ■ コードに実行にコンパイルという処理が必要 14 コンパイルについて

Slide 15

Slide 15 text

■ Rustのコンパイル時には最適化レベルが存在する ■ cargo run(実行コマンド)を実行したとき ■ opt-level = 0 ■ コンパイルは早くデバッグ情報が有効化される。最適化は行われない。 ■ cargo run –releaseを実行したとき ■ opt-level = 3 ■ コンパイルは遅くデバッグ情報は無効化される。最適化が行われる。 ➢ Rustの速度は–releaseオプションがついて初めて発揮され る。 15 Rustのコンパイラレベルについて

Slide 16

Slide 16 text

■ 大抵の言語ではガベージコレクションによってメモリ領域のう ち、不要になった領域を解放している。例えばPythonだと明示 的にクリアすることでガベージコレクションが行われる。 ■ このような仕組みだと下記の事象が発生する。 ■ メモリ領域を必要以上に使う ■ メモリ領域の解放時に計算が止まる ■ Rustはガベージコレクションをもたない。下記の仕組みによりガ ベージコレクションなしでメモリ管理が可能となっている。 ■ 所有権 ■ 借用 16 メモリ管理について

Slide 17

Slide 17 text

name value ptr len 5 capacity 5 index value 0 h 1 e 2 l 3 l 4 o s1 17 所有権について

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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だとまれによくある誤操作

Slide 20

Slide 20 text

■ 所有権の概念があるため、関数に変数を渡すだけで元の 値が使えなくなる。 ここでs1の所有権が移ってしまうため、 標準出力でs1が使用できなくなる。 20 借用と参照について

Slide 21

Slide 21 text

■ 前述のケースを防ぐために変数に&をつけて参照を渡すという方法 がとれるようになっている。関数の引数に参照を取ることを借用と いう。 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 借用と参照について

Slide 22

Slide 22 text

■ 四則演算を行う際、型が違うとコンパイルエラーになる。下記のようにi32 とi64でもエラーになるので、Pythonと同じ意識でやっていると多くのエ ラーを出すことになる。 ■ 配列にアクセスできる型はusizeのみ。下記のように配列の任意の箇所にア クセスしたい場合、その方をusizeに変更する必要がある。 22 つまづきやすいポイント(型について)

Slide 23

Slide 23 text

■ Pythonではstr型一つだが、RustではString型と&str型、char型がある。 ■ String: 可変長の文字列 ■ &str: 固定長の文字列。文字列リテラル ■ char: 一文字を表す ■ 結合したいときはString + &strとする必要がある。 23 つまづきやすいポイント(文字列の扱いについて)

Slide 24

Slide 24 text

■ “dog”と”cat”の2つの文字列から、先頭の文字から交互に合成し た”dcoagt”という文字列を生成したい場合 Python Rust 24 つまづきやすいポイント(文字列の扱いについて)

Slide 25

Slide 25 text

25 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 26

Slide 26 text

■ PyO3はRust製ライブラリのPythonバインディング作成用のライブラリ ■ Rustで作った関数をPythonから呼び出せるようになる ■ 使い方 ■ 専用のフォルダを作成しmaturin initを実行 ■ lib.rsというファイルが生成されるので、そこで呼び出される関数を作成 ■ maturin develop –releaseを実行するとpythonから読み込めるモジュールが生成され る ※--releaseをつけないと本来の速度が出ない ■ 生成されたモジュールをpythonでimportして使用する。 ■ 詳細は公式参照 26 PyO3とは

Slide 27

Slide 27 text

lib.rsの例 Pythonの実行ファイル 27 PyO3の利用例

Slide 28

Slide 28 text

■ 問題設定 ■ 初期点を100個ランダムに生成し、初期経路もランダムに生成する。 ■ 2つの辺をランダムに組み替え、経路長が小さくなれば採用する焼きなまし (2-opt)を2秒間行い、結果をPythonと焼きなましの部分のみPyO3(Rust)を 使用した結果を比較 ■ 使用コード 初期点 初期解 改善解 28 PyO3で巡回セールスマン問題を解く

Slide 29

Slide 29 text

■ 実験を10回試行した平均値 ■ 同じ時間でPyO3だとPythonの100倍以上(!?)試行が回せ、最終的な経路長 もその分短くできている。 ■ 極力同じようなコードになるよう心がけたが、おそらくPythonに不利な書 き方になっている可能性がある。でも10倍くらいは速度の違いが出ること が多い印象。 PyO3(Rust) Python 最終経路長 13,207 17,007 試行回数 9,891,702 83,939 29 実験結果

Slide 30

Slide 30 text

30 目次 1. 概要・Rustについて 2. RustとPythonに共通する概念 3. PythonにないRustの概念 4. PyO3でPyhonからRustを使う 5. まとめ

Slide 31

Slide 31 text

■ まとめ ■ Rustの基本的な仕組み、及びPythonユーザがRustを学ぶ際の差分やつまづきや すいポイントを紹介した。 ■ RustとPythonの速度比較を実験し、RustはPythonに比べかなり高速にプログラ ムの実行が可能であることを示した。 ■ 感想 ■ Rustはwebの情報がかなり充実していてかなり学びやすかった。入力補助ツール Rust-analyzerは非常に使いやすいし、例題として競技プログラミングの問題を 解くことを繰り返すだけで一定レベルまでは書けるようになったと思う。 ■ 低レイヤの知識が必要なプログラミング言語を学ぶことで、Pythonを使用して いる時に言語側に任せていること(メモリ管理や型推論)が意識できてよかった。 31 まとめと感想