⛳
[Python(pypy)&Julia] gzファイルの読み込みパフォーマンス比較
背景
この使い方でJuliaが別に高速じゃないのは分かっていますが…。
処理の概要
- ディレクトリにgzファイルが置かれている(000からfffまで4096ファイル分)
- gzファイルの中身は文字列で、各行が1つのJSON文字列になっている
- 1つ1つgzを開いて、今探索しているキーと同じキーが含まれているJSON文字列を探す
- 抽出したJSON文字列に含まれているデータを集合に保存する
実装
大まかにこのような感じの実装になっています。Pythonとほぼ同じ処理をそのままJuliaでも書いています。Juliaで書くときは、最初にググって出てきた GZip.jl を使う実装と、その後google検索して出てきたCodecZlib.jlを使った実装、両方比較しました。
import glob
import gzip
import json
from tqdm import tqdm
def main(tuser):
fn_ans = f"data/{tuser}.csv"
ans_ids = set({})
with open(fn_ans, "r") as f:
for line in f:
line = line.strip()
ans_ids.add(int(line))
# gzファイルから対象ユーザのphotoidを探索する
all_user_ids = set({})
for line in tqdm(sorted(glob.glob("data/meta/*"))):
with gzip.open(line, "tr") as f:
for line_j in f:
line_j = line_j.strip()
data = json.loads(line_j)
uid = data["uid"]
pid = int(data["photoid"])
if uid == tuser:
all_user_ids.add(pid)
# 結果の出力 (関係なし)
print(len(ans_ids))
print(len(all_user_ids))
print(len(all_user_ids & ans_ids))
if __name__ == '__main__':
tuser = "61585804@N00"
main(tuser)
結果
ニコニコ動画見ながら片手間で測定しました(ふんわり)。
環境はM1 Mac (メモリ8GB) です。どちらもターミナルから普通にスクリプトを実行しました。
Python (pypy3)
M1 Macにpyenvを使って pypy3.9-7.3.9 をインストールして使いました。
100%|███████████| 4096/4096 [09:48<00:00, 6.96it/s]
python program.py 566.18s user 10.34s system 97% cpu 9:49.10 total
Julia
Julia version 1.6.7を使いました。
CodecZlib.jl版です。
100.0%┣████████████████████████████████████┫ 4.1k/4.1k [17:45<00:00, 4it/s]
/Applications/Julia-1.6.app/Contents/Resources/julia/bin/julia 1032.49s user 13.33s system 98% cpu 17:46.40 total
GZip.jl版です。遅すぎて実装がダメすぎるか、使い方間違ってる気がしてきましたね。
100.0%┣█████████████████████████████████┫ 4.1k/4.1k [01:12:46<00:00, 1s/it]
/Applications/Julia-1.6.app/Contents/Resources/julia/bin/julia program_gzip.j 3145.49s user 16.56s system 72% cpu 1:12:47.61 total
まとめ
普段使ってるUbuntu環境で測定したときはJuliaがpypy3を抜いたのですが、M1 Macでやったらpypy3に普通にボコられたので結論なしで終わります(情報なし)。実装(PythonとJuliaの書き捨てコード)はこちらです。
Discussion