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")
まとめ
APIを叩く部分
pythonはrequestsでササッとできるけど
rustは依存関係のインストールが少し大変だし
非同期処理が必要だった
数値を表示する部分
rustは型の定義が大変そう(めんどくさい)
pythonは型が柔軟なので簡単に数値まで表示できました
ついでにレーダーチャートも作成しちゃったw
結果
処理速度と便利さ一長一短
APIにリクエストする部分ではAPIのサーバーやネット環境に依存するけど
その後の処理速度の面ではおそらくRustが勝っている
それだと少しめんどくさいけどPythonよりRustの方がいいじゃんとなるけど、Pythonは型が動的型付けのためJsonの形さえ把握でできればすぐコードをかけるためやっぱり一長一短
# 使用したコード