laclefblog logo

Sun, 04 Jan 2009

Pythonを20%速くするパッチ

GCCを使って、静的initialized版jump tableを使うと、こうなるらしい。

全ての環境で改善が見られるかといえばそういうわけでもなく、とりあえず、早くはなるみたい。(遅いと言われる)Haskellにも使えるのかな。

Fri, 05 Dec 2008

Python 3.0

まあ、暫くは様子見というか、積極的に最新版を求める環境にしていないので(with文だって全然使ってないし)、メモだけ。

printが関数化したとか辞書関連が大きくいじられたのが大きい。新機能としては、辞書をリスト内包表記の様に書けるようになったとか。

Unicodeを標準文字コードとしたのはありがたい。

Sun, 30 Nov 2008

pyjamas

pyjamas is a stand-alone python to javascript compiler, an AJAX framework / library and a Widget set API.

いつまでAjaxが人気なのか分からない時期に、割と後発の登場。PythonからJavaScriptを生成するというわけで、システムのほとんどをPythonで書ける利点が生まれるし、必要ならJSファイルを追加で書けば良い。

Googleが使いそうだなあ。

ところで、`PyPy`_ はRPython to JavaScript converterを持っているのだけれど、使っている人を見掛けない。

Sun, 16 Nov 2008

Haskellで作成した関数をPythonから使う

漸くHaskellに慣れてきたが、Pythonの方が使い勝手が良いと感じることに変わりはない。

互いの良さを取り、上手く使い分けるために、HaskellとPythonのFFI(Foreign Function Interface)を用いる。

Haskell/GHCでForeign.Cを用いてC共有ライブラリを作成し、Pythonからctypesで使用する。

まず、Haskellで関数を格納したモジュールを書く(hstopy.hs)。

module Htop where
import CString

fact :: Int -> Int
fact n = if n == 1 then 1 else (n * fact (n - 1))

factorial :: Int -> IO Int
factorial n = return (fact n)

mystring :: IO CString
mystring = newCString "hello haskell world!"

foreign export ccall factorial :: Int -> IO Int
foreign export ccall mystring :: IO CString

FFIの性質上、色々をIOモナドで包む必要がある。

次に、ランタイム初期化と脱初期化のためのエントリィポイント用コードを書く(必要最小限、hstopy_init.c)。

static void __attribute__ ((constructor)) mylib_init(void)
{
    hs_init(0, 0);
}

GHCでコンパイルする。

$ ghc -c hstopy.hs -fglasgow-exts
$ ls
hstopy.hi  hstopy.hs  hstopy.o  hstopy_init.c  hstopy_stub.c  hstopy_stub.h  hstopy_stub.o

GHCで共有ライブラリを作成する。

$ ghc -package unix -optl "-shared" -o libhstopy.so hstopy_init.c hstopy.o hstopy_stub.o
  # -package unix は今回は不要?
$ ls
hstopy.hi  hstopy.hs  hstopy.o  hstopy_init.c  hstopy_init.o  hstopy_stub.c  hstopy_stub.h  hstopy_stub.o  libhstopy.so

ctypesで共有ライブラリの関数を用いるために、関数ラッパを書く(hstopy.py)。

#!/usr/bin/python

import ctypes
_lib = ctypes.CDLL( './libhstopy.so')

_lib.factorial.argtypes = [ctypes.c_int]
_lib.factorial.restype = ctypes.c_int

_lib.mystring.argtypes = []
_lib.mystring.restype = ctypes.c_char_p

factorial = _lib.factorial
mystring = _lib.mystring

Pythonから使用する。

$ python
Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hstopy
>>> hstopy.mystring()
'hello haskell world!'
>>> hstopy.factorial(4)
24
>>> hstopy.factorial(5)
120

Foreign.Cでもctypesでもポインタも扱えるので、もう少し手の込んだことも出来る(はず)。

Sat, 11 Oct 2008

パーサライブラリ

最近HaskellのParsecで遊んでいて、Pythonの方のパーサライブラリが気になったのでGoogleで検索したら、ビンゴなページがあった。2004年9月に作成して、2008年7月に更新している。偉い。

Pythonで書かれているもの、多言語インタフェースを持っているもの、古いもの当たらしいもの列挙状態で、選択は利用者に委ねられている。

Sat, 23 Aug 2008

Pythonでビデオデバイスにアクセス

ブログ他参考文献が割と豊富な [1] [2] VideoCapture - A Win32 Python Extension for Accessing Video Devices (e.g. a USB WebCam, a TV-Card, ...) はWindows専用ライブラリなので、Linuxでは使えない(これさえ使えれば簡単なのに)。

[1]gumuz’ devlog » Blog Archive » Python webcam fun - motion detection: http://web.archive.org/web/20070520024828/http://gumuz.looze.net/wordpress/index.php/archives/2005/06/06/python-webcam-fun-motion-detection/
[2]code and martial arts: motion capture in python: http://janto.blogspot.com/2006/01/motion-capture-in-python.html

Search results for python VideoCapture linux - MarkMail で調べると、やはり気にしていた人は居たみたい。

で、メーリングリストで示された代替案としては、以下のものがある。

libfgは Video4Linux のAPIを操作するためのライブラリ。Video4Linux2には未対応の様だ。

ならば GStreamer: open source multimedia framework [3] を使えば出来るかとも考えたが、いまいち情報が足りない。

[3]GStreamer - Wikipedia: http://ja.wikipedia.org/wiki/GStreamer

WebCamSpyはWebカメラを操作するためのライブラリ。wxPython、pyParallel、pySerialを外部ライブラリとして必要とする(面倒臭い)。

[4]OpenCV - Wikipedia: http://ja.wikipedia.org/wiki/OpenCV

通称、OpenCV。画像処理等に使われる、Intel製ライブラリ。Ubuntuのパッケージにpython-opencvってのがある。参考文献が多いし、これだな。

Sun, 06 Jul 2008

OSM解析

最近、日本語版も始まった OpenStreetMap のデータを解析して、 A* アルゴリズムを用いて任意の2地点間が最短距離となるような経路を発見するための、Pythonライブラリ。

画像出力機能付きという余裕っぷり。

Mon, 30 Jun 2008

ElementTree

Python 2.5以降には標準モジュールとして搭載されているelementtree。

minidomを使うのも面倒、というかXPathでXMLを処理したい、と考えたときはこれが役立つ。

少し前からは、 lxml のetreeやobjectifyを用いる方が人気という噂も目にする。

Python in Web browser

Silverlight 2とIronPythonで、Webブラウザ上で動作するPythonシステムを作ったらしい。

Web OS云々も、Windowsの悪いところを全て取り除いて、かつ、Pythonが動作すれば問題無いかも。

Thu, 26 Jun 2008

PythonのGUIライブラリ比較

PythonのGUIライブラリとして、Tkinter、wxPython、.NET with IronPython、PyQT、Pyglet、Win32 with ctypes、Venster、PyGTK の、"Hello World"比較。

付け加えるとしたら、Swing with Jython、 pygameRabbytuxPython くらいかな。 Pyui は2003年に1.0出して止まっているし。

PythonのGUIライブラリは豊富過ぎて、電池が過充電状態。選択時に将来性とか書き易さとかで結構迷う。因みに現在はPyGTK。