« 2017年6月 | トップページ

2017年7月

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年7月 7日 (金)

Fontconfigを使ってフォントの横幅を変える方法

ヒンティングの設定や、fontconfigかなにかの更新でurxvtの横幅が大きく変わることがあったので、フォントの横幅を変えて対処してみました。

もとのフォント設定はPrimaSansMono BTで、新たにPrimaSansMono BT2を作ってその横幅を縮めます。この設定は~/.config/fontconfig/fonts.confに加えました。

<match>
  <test name="family" compare="eq"><string>PrimaSansMono BT2</string></test>
  <edit name="family" mode="assign" binding="same"><string>PrimaSansMono BT</string></edit>
  <edit name="matrix" mode="assign">
    <matrix><double>0.95</double><double>0</double>
            <double>0</double><double>1</double>
    </matrix>
  </edit>
</match>

0.95のところの数字を適当に変えます。わたしの今の環境では、これを0.96にすると1倍と同じくurxvtの横幅が一気に150ドット伸びました。どこかに閾値があるみたいです。

urxvtの設定はxrdbに読みこませるリソースなどでおこないます。もともとPrimaSansMono BTだったのをPrimaSansMono BT2にします。

URxvt*font: xft:PrimaSansMono BT2:pixelsize=14,\
            [codeset=JISX0208]xft:FGHeiseiKakuGothic:pixelsize=16

2017年7月 5日 (水)

Wesnothアドオンに関するメモ

Wesnothアドオンに関するメモ。Translation MODとか。

続きを読む "Wesnothアドオンに関するメモ" »

« 2017年6月 | トップページ