月曜日, 8月 31, 2009

Ubuntu Tweak

UbuntuのGNOMEデスクトップの隠し設定が簡単にいじれるUbuntu Tweak(*1)というのを導入してみました。

インストールの仕方はこちら(*2)を参考。あいかわらずインストールしただけで、全然いじってないorz

*1 http://ubuntu-tweak.com/
*2 http://linuxpoison.blogspot.com/

seekしてからfromfileでデータを読む

以前にnumpy.fromfileを使ってファイルをseekしてからデータを読むことができない、などと書いてしまいましたが、できました orz

with open('foo.data','rb') as f:
    f.seek(128)
    data = numpy.fromfile(file=f, count=1, dtype=dt)

やっぱり勉強不足だ orz

土曜日, 8月 29, 2009

Hashtags

やっと理解した!

NodeBox/Qtをインストールしてみた

会場内O'Reillyブースでこの本を眺めていて、ProcessingのAlternativeとして以前から興味はあったけどPython使えなかったので今まで手を出せなかったNodeBoxですが、先週からPython頑張っているので今ならどうにかなるのではないかと思い、インストールしてみました。

と言っても、NodeBoxはOSX専用ですので、現在開発中のNodeBox/Qtを指示通りにインストール。Ubuntuでのインストールはこちらに詳しいです。

問題なく動きますが、持参したAtom Z550な機械ではちょっと厳しいかもしれません。

某イベントを覗きに行ってきた

当日券があると聞いてさらに悩んだ末、夜2時位に就寝、5時過ぎに起きて、新幹線に乗ってはるばる秋葉原へ行きました。お陰で、ここの所溜まっていた寝不足が更に厳しいです。会場ではRed Bull飲み放題で、4本飲んでどうにか眠気をやり過ごしました。今まで飲んだことはなかったのですが、なかなかジャンクな飲み物ですね。

講演者は予想通り凄い人ばかりで、十分に刺激になりました。特に某M社元会長様は自分の夢の実現への意欲がとても漲っていました。自分は既にいい加減いい歳にもかかわらず惰眠を貪る生活に現を抜かして過ごしておりますが、やっぱり頑張らないとと思いました。

予想通り若い人ばかりでしたが、まぁ開き直るしかありません。明日も頑張ります。

金曜日, 8月 28, 2009

恐怖のメッセージが出た

RD-Z1で録画したデータの整理をしていたら「HDDの状態が複雑になりました」メッセージが orz

ちまちまとアナログ番組に使用しているから出るべくして出たと思うけど…この忙しいときに orz

f2pyを使ってf90のサブルーチンに配列を渡す

f2pyを使ってPythonで使えるモジュールをFortran90で書いていたのですが、例えば、

subroutine foo(a,n)
   integer,intent(in),dimension(n) :: a
   integer,intent(in) :: n
みたいなサブルーチンからf2pyでモジュールbarを作成して、
import bar
a = numpy.array([1,2,3,4])
bar.foo(a,a.size)
みたいに呼び出す所を間違えて"bar.foo(a)"としても、サブルーチン側にはちゃんと配列の大きさが渡っているのに気が付いて不思議に思っていました。

こちら(*1)を見てモジュールbarの__doc__を確認すると、

This module 'bar' is auto-generated with f2py (version:2_5972).
Functions:
  foo(a,n=len(a))
という風なインターフェースが作られていることが判ったのです。

ちょっと安心。

*1 Writing fast Fortran routines for Python

チケット買いそびれた orz

基本的に引き籠り系のねこさんですが、最近は年に1回位は何かしらイベントを覗きに行って、元気な人から刺激を貰うように心掛けていまして、今年は頑張って(主に金銭面で。それと月曜の午前中にプレゼンがあるけど、まだ準備できてない…とか orz)みようかとこちらのイベントに行くか行かないかギリギリまで悩んだ末にポチッた所…クレジットカードの承認が何故か通らなくて、そのまま時間切れ orz

週末どうしようかなー orz

木曜日, 8月 27, 2009

GwitterGwibberをインストールしてみた

Core Duo 2GHzなPCにはSpazを入れてtwitterしていたのですが、Atom Z550なNote PCにはかなり重すぎです。で、どうしようかと思っていたのですが、試しにGwitter(寝ぼけてました orz)Gwibberを使ってみることにしました。

ちょっと使ってみた所では起動も軽くていい感じです。不安定みたいな事も書かれていますがどうでしょう?

Mercurialのcgiファイル名を隠蔽する

こちら(*1)を見ながらMercurialのcgiインターフェースを用意したのですが、アクセスするURLにcgiファイル名が見えるのが微妙に気になっていました。

たまたまこちら(*2)をお見かけしたので試してみましたが、どうもうまく行きません。やけくそになりして、cgiファイルに追記する内容のうち、

os.environ['SCRIPT_NAME'] = os.getenv('SCRIPT_URL')[:-len(os.getenv('PATH_INFO' , ''))]

os.environ['SCRIPT_NAME'] = 'cgiファイルのあるURL直書き'
にしたところうまく行きました(あたりまえ?)。


*1 http://www.proton.jp/main/programming/mercurial.html
*2 http://8-p.info/mercurial-dreamhost.html

水曜日, 8月 26, 2009

Psycoをよくよく使ってみた

前エントリでndarray使いながらPsyco使うと微妙…なんて書きましたが、良く良く見ると、ちゃんと処理速度上がってる!

…あれって思って、一番最初に書いた全然工夫してないコードにPsyco付けたらめちゃめちゃ処理速度高い! → さすがにそれは言い過ぎ(勘違い…システムサイズを間違えてた orz)でした。

もうこれでいいです。 → やっぱりf2pyで書いた方がそれなりには速いです。でも、今評価しているコードではPsycoだけでf2pyのコードと比べて0.7倍程度の処理速度でしたので、元がndarrayを使ったPythonコードだと思うと驚くほどに速いです。

Psycoを使ってみた

Scipy.weaveやらF2Pyを使って計算の高速化を試みていましたが、モジュールによるJITコンパイラ実装であるPsyco(*1)を試してみました。

こちら(*2)にあります様に、psycoのimportとfull()メソッドの呼び出しだけで使える様です。ご利益の方ですが、importしているモジュール内のメソッドには反映されないので、ndarrayをコンテナに使っているプログラムでは効果は薄いですね。それでも30%以上は速くなりました。

*1 http://psyco.sourceforge.net/
*2 http://hasezawa.ib.k.u-tokyo.ac.jp/zp/Kbi/PythonSpeedUp

Mercurialを複数リポジトリ対応にしてみた

こちら(*1)で複数リポジトリへの対応の仕方を見つけたのでやってみた。

hgweb.cgiではなくてhgwebdir.cgiを使う、リポジトリの設定はhgweb.configに書く、などの他はこちら(*2, *3)と大体一緒。リポジトリを増やすときは、

  • hgweb.configにリポジトリを書き足す。
  • リポジトリを集めるディレクトリを決めてcollectionsを設定すれば、上記は不要。
  • リポジトリのディレクトリを作成して、hg init
  • hgrcをコピーする。
で良さげ。

大分イメージが掴めてきた。

*1 http://www.proton.jp/main/programming/mercurial.html
*2 http://www.dodgson.org/omo/t/?date=20070519
*3 http://www.chrysolite.jp/2009/02/28/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABmercurial%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

火曜日, 8月 25, 2009

f2pyを使ってみた

Scipy.weaveも良いけどFortranで計算した方が速かったりしないかな?という疑問を解決すべく、f2pyも使ってみました。

やっぱりそれなりに落とし穴がありまして、f90で書くときは変数宣言時の精度指定にkind(0d0)みたいな書き方をするとこけます(参考 *1) orz

あとintent(out)とか指定して、

[f77]
subroutine foo(x,y)
   real,intent(in) :: x
   real,intent(out) :: y
   y = 2d0 * x
end
Python側でfoo(x,y)と呼び出すと「引数が多すぎるで」と怒られます(参照 *2)。
[python]
y = foo(x)
みたいに値を受け取らなければいけないようです。ちゃんとここいら(*3)を読んでからやるべきだったかも知れません。

肝心の計算速度ですが…ちょっと速くなりましたが、正直どっちでもいい感じです。

*1 http://cens.ioc.ee/projects/f2py2e/FAQ.html
*2 http://osdir.com/ml/python.f2py.user/2008-01/msg00002.html
*3 http://scipy.dip.jp/index.php?F2PY

Mercurialを導入

と言う訳(?)で、Mercurialを導入してみることにした。以前から興味はあったのだけど、一人でコード書いていてVersion Controlを使いたいと思うことが少なかったこともあって、マジメに使おうとは思っていなかった。

さくらを使っているので、情報がちょっと古いけどこちら(*1)こちら(*2)こちら(*3)を参考にインストール。

動作確認まではした…けど正直使い方がまだよく分かってない orz

*1 http://d.hatena.ne.jp/umezo/20080320/1206015911
*2 http://www.dodgson.org/omo/t/?date=20070519
*3 http://www.chrysolite.jp/2009/02/28/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABmercurial%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

Scipy.weaveを使うべきか?

朝起きて評価し直してみたら、やっぱりweave使った方が速かった。システムサイズを大きくすると、オブジェクトやコンテナのコピーを避けて計算させるのはやっぱり難しい。

コードをブランチさせるかな、どうしよう。

ndarrayでハマったこと

ndarrayコンテナを添字付きアクセスするときはa[i,j,k]の様に書きます。a[i][j][k]でも動きますが、オーバヘッドが掛かります。とは言っても、添字付きアクセス自体が重すぎですので、なるべくは添字付きアクセスはしない方が良いです。

あと部分配列を取り出すのはa[i1:i2,j1:j2,k1:k2]の様に書きます。この場合、a[i1:i2][j1:j2][k1:k2]はまったくの間違いです。うろ覚えで書いていて、いろんな意味で時間を失いました orz

Pythonでそこそこ高速な数値計算

Scipy.weaveなど試してみたりしましたが、結局どういうふうに着地したか…と言いますと、実はインラインコードは採用しませんでした。何故ならば、ndarrayコンテナをうまく捏ねくり回して計算した方が速くて綺麗だったからです。インタプリタだと思って侮っていました。Python+ndarrayほんと良くできてます。

とにかくまずこのあたり(*1)を勉強した方が良さそうです。これら(*2)を勉強するのはもう少し後にすることにします。

*1 http://www.scipy.org/Tentative_NumPy_Tutorial
*2 http://www.scipy.org/PerformancePython#head-3e5e0b392866d319bb08e78a4f184fca7d32e9bd

月曜日, 8月 24, 2009

PythonでC++コードを埋め込んで実行してみる

仕事でPythonコードを書いているのですが、かなり大きなデータファイル(500GB)を読み込んで解析計算をすることが望まれていて、実際の所相当な処理能力を求められつつあります。今手元にある2時間+α程度で作成したコードでは現実的な時間で処理することが難しいと思われます。このコードの処理時間を測定して、どの処理がどれくらい遅いのかを明らかにしながらボトルネックの高速化を図る必要があります。で、コードのいろいろな部分の計測を行いまして、for文を使って繰り返し計算を行う所が遅いという知見が得られました。で、これをどうするかが次の問題です。

C++で書いたコードを呼び出すような力技でいくのは効果があるかもしれないけど、学習時間と手間がしんどいだろうなと想像していました所、Scipy.weaveのinlineメソッドというものがあることをこちら(*1)で知りました。うまくいけば手間が掛からずにC++コードをマージすることができるかも、という淡い期待を抱き試してみることにしました。

うまくは行きましたが、それなりに落とし穴はありました。まず、Blitz(以前仕事で使っていたので懐かしいです)を使おうとするとUbuntu 9.04デフォルトのg++-4.3ではコンパイルできません。こちら(*2)にありますようにg++-4.2を読み出すと動きます。とりあえずg++-4.2から/usr/local/bin/(PATHの順序が/usr/bin/より先)へリンクを張ることで対処しました。

結構戸惑ったのは、コンパイルに失敗したときのエラーメッセージがPythonのものとg++のが入り混じってメッセージの可読性が非常に悪い事です。これはもう、慎重に書くか少しずつ書き足していくか、別にC++のみでコードを書き、十分にバグ取りをしてから持ち込む等をしないうまく行かないように思います。長いC++コードを書ける気がしません。

詳しいことはこちら(*3)こちら(*4)を参考にしました。

そうして書いたコードですが、確かに速くはなります。ですが、思った以上に呼び出しのオーバーヘッドが大きいようで、実行時間の短いコードを何度も呼び出すような使い方には向いていません。やはり実行時間の長いコードを丸投げするような使い方が良い様に思います。

*1 http://scipy.dip.jp/index.php?SciPy%2FWeave
*2 https://bugs.launchpad.net/ubuntu/+source/python-scipy/+bug/302649
*3 http://www.mpia.de/homes/tamburro/whatisthepython/weave/weave.html
*4 http://www.scipy.org/PerformancePython#head-3e5e0b392866d319bb08e78a4f184fca7d32e9bd

Pythonで実効速度評価をする

import time
   :
start = time.time()
   :
 # なんかする
   :
print time.time()-start

これは簡単。