Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

PythonユーザによるRust入門

 PythonユーザによるRust入門

社内勉強会で使用した資料です。PythonユーザがRustに入門する際に必要となる知識やつまづきやすいポイントを記載しています。

MIZUTANI RYOTA

June 02, 2022
Tweet

More Decks by MIZUTANI RYOTA

Other Decks in Programming

Transcript

  1. ▪ なぜRustをやってみようと思ったのか? ▪ 現状まともにかける言語はPythonのみ。最もよく使うのはJupyter ▪ AHC(Atcoder Heuristic Contest)を最近やっているが、探索数が重要 となる問題の場合、Pythonでは計算時間上明らかな不利が生じる。 ▪

    ここ5年くらいほぼPythonしか触ってないので別の言語を試してみた い。 ▪ C++かRustか迷ったがRustの方が面白そう ▪ 次項からRustの説明をしますが、かなり抜粋した内容となっ ていますので、詳細は以下の参考文献を参照いただければと 思います。 ▪ 公式ドキュメント(日本語) ▪ 実践Rustプログラミング入門 4 はじめに
  2. ▪ 2015年に正式リリースされたプログラミング言語 ▪ 言語の特徴 ▪ 速度が早い ▪ 信頼性が高い ▪ 多くのバグをコンパイル時に排除できる

    ▪ ツール群が充実している ▪ 多数のエディタに対応するスマートな自動補完と型検査機能、自動 フォーマッタ等々 5 Rustとは
  3. Python Rust 速度 ✕ ◯ 書きやすさ ◯ △ 保守性・システム安全性 ✕

    ◯ ライブラリ ◯ △ ▪ Rustが優位なケース ▪ 運用が必要となるシステム開 発 ▪ 速度が重要となる場合 ▪ Pythonが優位なケース ▪ 分析用コード等再利用や改修をを 考慮しない場合 ▪ 機械学習系のライブラリを利用し たい場合 6 Rust vs Python
  4. ▪ 変数の定義 ▪ Rustは要型指定(殆どの場合型推論される)。 ▪ Rustは基本immutable。後で変更する可能性がある変数にはmutが必要。 Python Rust 整数 int

    i8, i16, i32, i64, i128, isize 浮動小数点 float f32, f64 文字列 str String, &str, char Python Rust 9 変数定義について
  5. Pythonはインタープリタ言語、Rustはコンパイラ言語。 ▪ インタープリタ言語 ▪ コードを逐次機械語に翻訳して実行 ▪ メリット ▪ 部分的なコード実行が可能 ▪

    デメリット ▪ 速度が遅い ▪ コンパイラ言語 ▪ 全てのコードを一度に機械語に翻訳し、その後実行。 ▪ メリット ▪ 速度が早い ▪ デメリット ▪ コードに実行にコンパイルという処理が必要 14 コンパイルについて
  6. ▪ Rustのコンパイル時には最適化レベルが存在する ▪ cargo run(実行コマンド)を実行したとき ▪ opt-level = 0 ▪

    コンパイルは早くデバッグ情報が有効化される。最適化は行われない。 ▪ cargo run –releaseを実行したとき ▪ opt-level = 3 ▪ コンパイルは遅くデバッグ情報は無効化される。最適化が行われる。 ➢ Rustの速度は–releaseオプションがついて初めて発揮され る。 15 Rustのコンパイラレベルについて
  7. name value ptr len 5 capacity 5 index value 0

    h 1 e 2 l 3 l 4 o s1 17 所有権について
  8. 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
  9. 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だとまれによくある誤操作
  10. ▪ Pythonではstr型一つだが、RustではString型と&str型、char型がある。 ▪ String: 可変長の文字列 ▪ &str: 固定長の文字列。文字列リテラル ▪ char:

    一文字を表す ▪ 結合したいときはString + &strとする必要がある。 23 つまづきやすいポイント(文字列の扱いについて)
  11. ▪ PyO3はRust製ライブラリのPythonバインディング作成用のライブラリ ▪ Rustで作った関数をPythonから呼び出せるようになる ▪ 使い方 ▪ 専用のフォルダを作成しmaturin initを実行 ▪

    lib.rsというファイルが生成されるので、そこで呼び出される関数を作成 ▪ maturin develop –releaseを実行するとpythonから読み込めるモジュールが生成され る ※--releaseをつけないと本来の速度が出ない ▪ 生成されたモジュールをpythonでimportして使用する。 ▪ 詳細は公式参照 26 PyO3とは
  12. ▪ まとめ ▪ Rustの基本的な仕組み、及びPythonユーザがRustを学ぶ際の差分やつまづきや すいポイントを紹介した。 ▪ RustとPythonの速度比較を実験し、RustはPythonに比べかなり高速にプログラ ムの実行が可能であることを示した。 ▪ 感想

    ▪ Rustはwebの情報がかなり充実していてかなり学びやすかった。入力補助ツール Rust-analyzerは非常に使いやすいし、例題として競技プログラミングの問題を 解くことを繰り返すだけで一定レベルまでは書けるようになったと思う。 ▪ 低レイヤの知識が必要なプログラミング言語を学ぶことで、Pythonを使用して いる時に言語側に任せていること(メモリ管理や型推論)が意識できてよかった。 31 まとめと感想