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 を使えば良いと思う。
# もっとも上のように自分で書いても知れてると思うけど