0
0

PythonとRustでAPIの叩き方を比較する

Last updated at Posted at 2024-09-29

PythonとRustでAPIの叩き方を比較する

前置き

今回比較する対象はPokeAPIを叩くプログラムをPythonとRustで書きます。

ちなみに叩くポケモンはハバタクカミです。

本当は種族値まで表示したかったのですがちょっとRustでの型が難しそうなので妥協しました

Rustで実装

main.rs
// インポート関連
use reqwest::Client;

type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
#[tokio::main]
async fn main() -> Result<()> {
    // APIを叩く
    let client = Client::new();
    let url = "https://pokeapi.co/api/v2/pokemon/987";
    let res = client.get(url).send().await?;

    let body = res.text().await?;
    // 出力
    println!("{}", body);
    Ok(())
}

あとCargo.toml

Cargo.toml
[package]
name = "hoge"
version = "0.1.0"
edition="2021"
[dependencies]
proconio = "0.4.5"
itertools = "0.11.0"
itertools-num = "0.1.3"
rand = "0.8.5"
reqwest = { version = "0.11.4", features = ["json"] }
tokio = { version = "1.11.0", features = ["full"] }
serde = { version = "^1.0.130", features = ["derive"] }
serde_json = "^1.0.67"

[[bin]]
name = "hoge"
path = "./main.rs"

Pythonで実装

実装する前に必要なライブラリ

  • requests
  • matplotlib
    あれmatplotlib

実装

main.py
# インポート
import requests
import json
import matplotlib.pyplot as plt
from math import pi

# APIを叩く
url = "https://pokeapi.co/api/v2/pokemon/987"

res = json.loads(requests.get(url=url).text)
# echo あれ種族値だ 妥協したんじゃなかったけwww
# echo Pythonはめちゃくちゃ型が柔軟なのでできたよ
# echo あっそ

label_list = []
value_list = []

for stats, p in zip(res["stats"], ["HP", "攻撃", "防御", "特攻", "特防", "素早さ"]):
    print(f'{p}:{stats["base_stat"]}')
    label_list.append(p)
    value_list.append(stats["base_stat"])

おまけ

main.py
value_list += value_list[:1]

angle_list = [n / float(len(label_list)) * 2 * pi for n in range(len(label_list))]

angle_list += angle_list[:1]

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
plt.xticks(
    angle_list[:-1], label_list, color="grey", size=12, fontname="Source Han Code JP"
)  # fontnameはご自由にどうぞ

ax.plot(angle_list, value_list, linewidth=1, linestyle="solid")
ax.fill(angle_list, value_list, "blue", alpha=0.1)

# ./chart.pngに保存
plt.savefig("chart.png")

おまけにレーダーチャートを作成してみましたw
chart.png

まとめ

APIを叩く部分

pythonはrequestsでササッとできるけど
rustは依存関係のインストールが少し大変だし
非同期処理が必要だった

数値を表示する部分

rustは型の定義が大変そう(めんどくさい)
pythonは型が柔軟なので簡単に数値まで表示できました
ついでにレーダーチャートも作成しちゃったw

結果

処理速度と便利さ一長一短
APIにリクエストする部分ではAPIのサーバーやネット環境に依存するけど
その後の処理速度の面ではおそらくRustが勝っている
それだと少しめんどくさいけどPythonよりRustの方がいいじゃんとなるけど、Pythonは型が動的型付けのためJsonの形さえ把握でできればすぐコードをかけるためやっぱり一長一短

# 使用したコード

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0