Pandas で 文字列変換 & Python 3.13 GIL 無効化の話

780 Views

October 22, 24

スライド概要

PyLadies Tokyo 10th Anniversary

profile-image

池上有希乃です・・・†

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Pandasで 文字列変換 & Python 3.13 GIL 無効化の話 2024/10/20 Pyladies Tokyo 10th Anniversary Party 池上 有希乃

2.

自己紹介: いけがみ ゆきの ● ● ● ● Pyladies Tokyo 1周年のころから参加してます Python歴 ≒ プログラミング歴 ≒ 14年 自然言語処理に興味があり OSSでPythonライブラリ作ってる ○ ○ ○ 日本語文字種変換: jaconv かな漢字変換: mozcpy などなど…… ● Twitter: yukinoianoia ● 自己紹介詳細: https://ikegami-yukino.github.io/

3.

今日話すこと ● Pandas での文字列変換のやり方 ● Pandas を並列処理する Pandaral·lel の紹介 ● Pandaral·lel で Python 3.13 の GIL 無効化の恩恵はあるか簡易検証

4.

「いまさら文字列前処理の話…? 」って思ったそこの 君! LLM時代でも前処理は重要 ● コンピュータが文字コードで文字を識別している以上 文字コード問題は避けられない ○ ⿁ (U+2FC1) と 鬼 (U+9B3C) 等 パッと見同じでも文字コードは違う ● 仮にLLMで前処理できても定型処理やらせるのは計算コストの無駄 ● データに誤変換などのヒューマンエラーがある可能性はゼロではない

5.

日本語文字列変換いろいろ ● jaconv ○ ひらがな -> カタカナ、カタカナ -> ひらがな、カタカナ -> カタカナなどに相互変換 ● ja_cvu_normalizer ○ ○ ○ 異体字正規化 (髙 -> 高、㆞ -> 地など) PDF 変換処理 と フォントの相性で漢字が化ける問題の解消 詳しく知りたい方は「PDF 康熙部首」で検索 今回は使わないけど気に入ってるので紹介

6.

Pandas で文字列変換するには? ● Series.str 内のメソッド series = pd.Series(["AAA"]) series.str.replace("A", "b") # => bbb series.str.lower() # => aaa series.str.zfill(6) # => 000AAA などなど…… ● map メソッドか apply メソッド ○ 今回はこっちの話!

7.

Pandaral·lel ● Pandas の map / apply メソッドを並列処理に対応できるモジュール https://github.com/nalepae/pandarallel ● 並列処理によって処理が重い・データが多い場合に処理速度効率化 ● 既存コードからの変更が少ない from pandarallel import pandarallel pandarallel.initialize() df.parallel_apply(func)

8.

Pandaral·lel による並列処理の効果 ● ● ● ● 対象: utf_ken_all.csv (住所の郵便番号全データ) の3カラム データ量: 上記 CSV をコピーして 10 倍増し (1,244,340行) 処理: jaconv で全角記号+数字を半角に変換してひらがなに変換 (コード) 単位: 秒 (20回実行した際の平均値) map parallel_map 11.38 4.16 ● Pandaral·lel を使うと速くなった! ● 同じ処理でも map よりapply の方が遅い ○ map で済むなら apply は使わない方がよさげ apply parallel_apply 58.83 17.85

9.

Python 3.13 の GIL 無効化 ● Python 3.13 では Global Interpreter Lock (GIL) を無効にできる オプションが追加された ○ ○ マルチスレッドプログラムが複数のコアを使って動くようになるオプション CPython がスレッドセーフで動作する保証とトレードオフ ● 環境変数 PYTHON_GIL=0 で無効化 ● 今回は macOS 15 の pyenv の 3.13.0t で実行してみた

10.

Pandaral·lel を GIL 無効化して実行 かっこ内は GIL 有効時との差 map 11.33 (-0.01) parallel_map 3.85 (-0.31) apply 57.79 (-1.04) parallel_apply 18.27 (+0.42) ● 微妙に速くなったり遅くなったり ● Pandaral·lel の並列処理のコードを変えれば改善の余地あり? ○ ○ 並列処理の関数で使った jaconv は Pure-Python ライブラリなので GIL 無効化の恩恵が得られると思ったのに…? Pandaral·lel の Author も気になってる模様 (メンテナ募集中っぽいので興味ある人はぜひ!Python界隈で目立つチャンス!)