Python手始め

Pythonでとりあえずなにか作ってみて、文法やらデータ構造の扱いを勉強しようと思ったのですが、作り始めたのはやっぱり


ローマ字自動認識


お前はこればっかりだな。と自分でも思いましたが、これがないとタイピングソフトが作れないし、前に一度C++で作っているからそれほど悩むこともなく書けそうだったからという感じですね。


3時間ぐらい文法と格闘してある程度完成したのですが、パフォーマンスを測定してみるとやっぱり遅い。C++の10倍くらいは確実に遅いです。


bsearchシュゴー - tomoemonの日記
ちょうど1年くらい前に作ったものですが、かな40文字変換×1000回に費やした時間はC++版が0.07秒、Python版が1.1秒かかりました。つまり、Python側は1回の変換で0.001秒使ってしまうということ。


タイピングソフトの時間測定はやはり1ミリ秒単位で行いたいので1000回にかかる時間を1秒以下にしたい。しかも、2.4GHzのCPUでこれだからできればオーダーを一つ下げたい。


profile.run()を使ってどこに時間がかかっているか測定してみると、

  • list.has_key(a)
  • map(lambda x:[x,1],list)

に時間がかかっている模様。ためしに両者をそれぞれ

  • a in list
  • [[x,1] for x in list]

という形式にしてみると、それだけで全体でかかる時間が半分になりました。シーケンス型の説明ではhas_key()はa in listと等価であると書いていますが、実装面では異なるみたいですね。どちらも関数呼び出しによるオーバーヘッドが原因なのでしょうか。そこをはっきりさせるにはPythonの中身を見てみないとだめそうなのでとりあえず今日は終了。