パソコン・インターネット

2017年7月20日 (木)

Python3のenumは遅い?

Python3.4からenumがサポートされたというので使ってみたところ、どうも遅いらしいです。

以前自分で作ったテキスト処理スクリプトの字句解析部にステートマシンを使っていたので、そのステートを示す定数をenumに変えたところ、もとの整数の変数で代用したものでは2.1秒くらいの処理だったのが、4.2秒くらいに増加しました。

整数の変数を使ったものはこんなコードです。ちなみにこの関数は1行ごとに呼び出していますが、range(4)を外に追い出してもほとんど速度は変わりませんでした。

def _split_words(line):
    ...
    ( ST_INDENT, ST_FIRST_CHAR, ST_SEARCH_TOKEN, ST_TOKEN ) = range(4)
    ( QT_SINGLE, QT_DOUBLE, QT_BACK, QT_NOTHING ) = range(4)
    st = ST_INDENT
    ...
    for idx in range(len(line)):
        ...
        if st==ST_INDENT:
            ...
            st = ST_FIRST_CHAR
        elif st==ST_FIRST_CHAR:
            ....

enumを使ったものは次のコードになります。forループは1文字ずつ全部まわる動作回数の多いコードになりますが、ステート定数は比較と代入しかしていません。

_split_words_st = enum.Enum('_split_words_st', 'INDENT FIRST_CHAR SEARCH_TOKEN TOKEN')
_split_words_qt = enum.Enum('_split_words_qt', 'SINGLE DOUBLE BACK NOTHING')

def _split_words(line):
    ...
    ST = _split_words_st
    QT = _split_words_qt
    st = ST.INDENT
    ...
    for idx in range(len(line)):
        ...
        if st==ST.INDENT:
            ...
            st = ST.FIRST_CHAR
        elif st==ST.FIRST_CHAR:
            ....

OSはLinuxで、Pythonは3.5.3と3.6.2で確認しました。実行時間は_split_words()関数の呼び出し前後をtime.perf_counter()で囲って測っていますが、8万回くらいある呼び出しそれぞれの実行時間を合計しています。

2017年6月25日 (日)

Pangoと倍角ダッシュ

いまさらの倍角ダッシュ問題。

Pangoが使われる描画で倍角ダッシュをどうできるかという話なのですが、PangoではEM DASH (U+2014)もHORIZONTAL BAR (U+2015)も分割禁止なようです。というわけで、どちらも使えます。

確認したPangoのバージョンは1.40.5-1です。

ちなみに、DejaVuSans (バージョン2.37) はHORIZONTAL BARのほうがつながるやつで、DroidSansFallbackFull (バージョン2.53) はEM DASHのほうがつながるやつです。

TWO-EM DASH (U+2E3A) を使えばすむのでしょうが、DejaVuSans (バージョン2.37) とDroidSansFallbackFull (バージョン2.53) には入っていません。TWO-EM DASHが入った規格 (Unicode 6.1.0 2012年) より古いフォントだからあたりまえだけど。

2015年12月29日 (火)

Pangoって何のソフト?

Pangoって何のソフト?

はじめに

Pangoっていったいなんなんでしょう? 作っている人がどう思っているかはともかく、現状どうなっているか調べたものを、(五月雨式ですが)書いておきます。まあ、組版をしてくれるんじゃねーの? ということで日本語組版処理の要件(日本語版)を参考に調べました。

Pangoのマークアップだけで〜の続編みたいなものです。Battle for Wesnoth (以下Wesnoth)のgettext機構だけを使って(要するに食わせる文字列だけが変更できる)、きれいに日本語を出そうというのが動機です。

Wesnothは両端揃えしない設定だったので、Imagemagickを使って両端揃えした時の結果も追加しました。

続きを読む "Pangoって何のソフト?" »

2015年10月29日 (木)

Fontconfigを使って日本語斜体を別フォントに置き換える方法

Fontconfigを使って日本語斜体を別フォントに置き換える方法

はじめに

具体例としては特定のソフトの話なのですが、何かのヒントになるかもしれないのでfontconfigの話として書いておきます。そもそもの動機はPangoのマークアップだけで〜の最後をご覧ください。傍点は結構良かったのですが、怪しげなやりかたなのでいつか人に迷惑をかけそうでした。そこで、自分の設定だけで良くしようと思ったのがこの設定を試した理由です。

続きを読む "Fontconfigを使って日本語斜体を別フォントに置き換える方法" »

2015年9月19日 (土)

Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果

Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果

はじめに

結論から言うと、ルビは無理で、傍点は良くない方法ならそれらしく見せられます。

PangoというのはLinuxでよく使われるテキスト描画ライブラリらしいですが、それはHTMLのようなタグで文字種などを変えられます。プログラムを組むともっといろいろできるようですが、やりたかったのは、プログラムを修正せずに食わせるテキストだけ変えてルビを打つことです。具体的にはBattle for Wesnoth (以下Wesnoth)のgettext機構を使って、日本語にルビをうつというものです。以下は具体例で説明します。ちなみにlibpangoのバージョンはよく分かりませんが、多分1.36.8です。

まずWesnothのWMLのマニュアルを見ると[message]と[floating_text]中でpangoのマークアップが使えます。[campaign]のdescriptionとかでも使えるようですが、明記されていません。そしてPangoのマークアップのマニュアルを見ると分かる通り、HTMLのルビ相当のタグはありません。

続きを読む "Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果" »

2014年9月 6日 (土)

poファイル向けEmacs font lock

po-modeを使わない場合に、poファイルにEmacsのfont lockで色を付ける設定をしてみました。Local Variablesを使うものと、最後に自前のモードを作ったのも載せておきます。

最初はLocal Variablesでファイルを読んだ時に自動的に設定されるようにしました。これはevalを使うので読み込み時にunsafeであると警告が出ます。

下のコードを最後msgidのコメントとして書いておきます。

# Local Variables:
# mode: Fundamental
# coding: utf-8-unix
# eval: (font-lock-add-keywords nil '(("^#.*$" 0 'font-lock-comment-face t) ("\"[^\"\n]*\"" . 'font-lock-string-face) "msgid" "msgstr"))
# End:
msgid "Sentinel for poedit."
msgstr "これがないとpoeditがコメントを消してしまう。

poeditは、コメントをmsgidの持ち物と思っているらしく、msgidの直前に書いてないとコメントが消えてしまいました。gettext系のツールはおそらくみんなそうなっています。だから最後のmsgidのコメントとして書いておけばいいでしょう。

続きで、msgcatみたいにたくさん色を使う設定も示しておきます。

続きを読む "poファイル向けEmacs font lock" »

その他のカテゴリー