Tsuchinoko

Tsuchinoko 🐍➡️🦀

Python to Rust トランスパイラ - 型ヒント付きPythonコードをRustに変換

Rust License Version Coverage Changelog

🇺🇸 English version

概要

TsuchinokoはPythonの型ヒント付きコードをRustに変換するトランスパイラです。 Pythonの読みやすい構文でアルゴリズムロジックを書き、Rustの安全性とパフォーマンスを得ることができます。

カバレッジ: Python構文機能の58%(86機能)をサポート。変数、演算子、制御フロー、関数、クラス(継承含む)、@property、データ構造、コレクション(list/dict/set)、文字列メソッド、リソース管理(with文)、Result型によるロバストなエラー処理など、アルゴリズムプログラミングに必要な基本構造をカバーしています。

設計理念 (Design Philosophy)

Tsuchinokoは汎用的なPythonコンパイラではありません。以下の理念に基づいて設計されています:

主要機能 ✨

ベンチマーク 🚀

Python (3.x) と Tsuchinoko生成Rustコード (rustc -Oでコンパイル) の速度比較です。 データ生成(LCG)とソート処理を含みます。

アルゴリズム データ数 (N) Python Tsuchinoko (Rust) 高速化率
Bubble Sort 10,000 5.394s 0.037s 約146倍 🚀
Radix Sort 10,000,000 8.908s 0.278s 約32倍 🚀

hyperfine を使用してローカル環境 (Linux x86_64, V1.0.0) で計測。

インストール

git clone https://github.com/tanep3/Tsuchinoko.git
cd Tsuchinoko
cargo build --release
cargo install --path .

使い方

# 基本的な変換
tnk your_file.py

# 出力先指定
tnk your_file.py -o output.rs

# Cargoプロジェクト生成
tnk your_file.py --project my_project

# チェックのみ(出力なし)
tnk your_file.py --check

[!NOTE] 外部ライブラリ (import) を使用する場合は、--project オプションを使用して依存関係を含む Cargo プロジェクトを作成してください。

[!IMPORTANT] venv 環境が必要です: Resident Worker (NumPy/Pandas等) を使用するコードは、Python の仮想環境内で tnk を実行し、生成されたバイナリも同じ venv 環境内で実行してください。

source venv/bin/activate
tnk script.py --project my_app
cd my_app && cargo run --release

入力例 (Python)

def bubble_sort(lists: list[int]) -> tuple[list[int], int]:
    sorted_list: list[int] = list(lists)
    list_length: int = len(sorted_list)
    for i in range(list_length):
        for j in range(list_length - i - 1):
            if sorted_list[j] > sorted_list[j + 1]:
                temp: int = sorted_list[j]
                sorted_list[j] = sorted_list[j + 1]
                sorted_list[j + 1] = temp
    return sorted_list, list_length

出力例 (Rust)

fn bubble_sort(lists: &[i64]) -> (Vec<i64>, i64) {
    let mut sorted_list: Vec<i64> = lists.to_vec();
    let list_length: i64 = sorted_list.len() as i64;
    for i in 0..list_length {
        for j in 0..((list_length - i) - 1) {
            if sorted_list[j as usize] > sorted_list[(j + 1) as usize] {
                let temp: i64 = sorted_list[j as usize];
                sorted_list[j as usize] = sorted_list[(j + 1) as usize];
                sorted_list[(j + 1) as usize] = temp;
            }
        }
    }
    return (sorted_list, list_length);
}

VS Code 拡張

エディタ内で直接 Python を Rust に変換!

📖 セットアップガイド Setup Guide

機能ドキュメント

詳細な機能一覧については以下を参照してください:

今後のロードマップ (Roadmap)

ドキュメント

ライセンス

MIT License

作者

Tane Channel Technology