LTSV パーサを書いた
Python の C 言語の拡張で書いてみた(Python2 系でしか動かないはず)。
GitHub - heavenshell/py-pyltsv: Dead simple LTSV parser written in Python C extension
最初 Pure Python で書いてたけど既に作られてたので、どうせならと勉強の意味も兼ねて C 言語の拡張として作ってみた。
LTSV な行とファイルのパースしかできない。
機能は足らないけど、Pure Python で書いた場合のより速度が出てるはず。
# -*- coding: utf-8 -*- def parse_line(string): line = string.decode('utf-8').rstrip() return dict([x.split(':', 1) for x in line.split("\t")]) def parse_file(file_name): with open(file_name, 'r') as f: lines = f.readlines() return [parse_line(line) for line in lines]
こんな感じの簡単なのと比べた場合、自分の環境だと以下のような感じだった。
py-pyltsv/benchmark.py at master · heavenshell/py-pyltsv · GitHub
Pure Python | C Extension |
111.830234528 | 80.0704956055 |
確かに速い。
書いてみた感想
C 言語は殆ど書いた事ないので、これで良いのか良くわからない。
あと文字列の操作が辛い。
split() だったり、strip() をわざわざ再実装した。
ひょっとして何かもっと楽な方法(Python の文字列操作している奴を C 言語から呼び出せたりとか)があったりするんだろうか。
良くわからない。
C を書く上でビルドとかそこらへんは全て setup.py 経由でやるととても簡単に出来て良い。
Python から呼び出す C の API のテストを書いて、本体を C を書いて、setup.py でビルド & テストを実行という繰り返しだけで行ける。
あ、当然ながら LTSV の Python のライブラリが欲しい場合は pypi にアップされてる ltsv を使えば良いと思う。
# もっとも上のように自分で書いても知れてると思うけど