路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

メモ: ひとりごと

2008-11-21 16:10:16 | プログラミング
Pythonのmultiprocessingを使って、lazy evaluationみたいなことできないかなあ。

random.Random()でインスタンス生成できたんだ。スレッドごとに乱数生成器を用意すれば、バグ再現できるよなあ。

BIOSの設定忘れてた

2008-11-20 18:39:41 | その他
8GBのメモリをつみました。OSもVista 64bitです。

けれど、タスクマネージャの物理メモリの欄によると、2.6GBしか認識されてません!

いろいろやって、結局、マザーボードのAMIBIOSの「Memory Remap Feature」がDisableであることが原因だとわかりました。

確かに、BIOS画面の右に、「32bit OSだったらDisable, 64bit OSだったらEnable」と書いてあります。

BIOSの設定を変えて再起動すると、めでたく物理メモリの欄に「合計 8190」の文字が。

はー、あせった。

(追記)
ページファイルの設定も修正しました。推奨どおり12GBに

スワップしながらなら、ヒープ20GB弱まで取れる計算。

快適だ。


sort -> uniq in Python #2

2008-11-20 15:22:37 | プログラミング
前回(2008/08/22のエントリ)は、イテレータを引数にするuniqをPythonで書いてみる、という話でした。

今回は、リストをインプレースで修正する(破壊的な)uniqを書いてみるというお話。

書こうと思えばどうとでも書けるので、3つほど書いてみました。

def uniqit(seq):
 if len(seq) <= 1:
  return
 i = 0
 for q in seq[1:]:
  if q != seq[i]:
   i += 1
   seq[i] = q
 del seq[i + 1:]
 
def uniqit2(seq):
 if len(seq) <= 1:
  return
 r = [ seq[0] ]
 r.extend(q for p, q in zip(seq, seq[1:]) if q != p)
 seq[:] = r

def uniqit3(seq):
 if len(seq) <= 1:
  return
 i = 1
 while i < len(seq):
  if seq[i] == seq[i - 1]:
   seq.pop(i)
  else:
   i += 1

で、これをランダムな整数のリストをソートしたものに適用してみる、というテストをしました。

a = [ random.randint(0, 1000) for _ in xrange(5000) ]
a.sort()

t0 = time.time()
for _ in xrange(100):
  b = a[:]
  uniqitなんたら(b)
t1 = time.time()
print t1 - t0

ここでクイズ。どれが一番速かったでしょうか。

答え。

・・・は示しませんので、ご自分でお試しください。ちなみに、最速と最遅では、かかる時間は1桁違いました。

蛇足ながら、以前のエントリで書いた、イテレータを引数とするuniqを使っても、当然同じことができます。

import itertools

def iuniq(enu):
 ps, qs = itertools.tee(enu, 2)
 yield ps.next()
 for p, q in itertools.izip(ps, qs):
  if p != q:
   yield p

def uniqit4(seq):
 if len(seq) <= 1:
  return
 seq[:] = [ v for v in iuniq(seq) ]

上述の3つと比べると、最速のものよりは遅いけれど、それ以外よりは速い、という結果でした。

なかなかやるなあ(自己満足)。

マイノリティ・リポートのアレを超えてる

2008-11-18 07:38:54 | ガジェット
記事「『マイノリティリポート』に最も近い、Oblongの空中動作認識インターフェイス「g-speak」(デモあり)」
http://jp.techcrunch.com/archives/20081117oblongs-g-speak-spatial-operating-interface-brings-minority-report-ui-to-life/
より。

まず「僕らが映画で見た内容のほとんどは、当時彼がマサチューセッツ工科大(MIT)でやっていた研究を基に作成」とあってびっくり。

で、デモを見てみると(派手さはともかく)使い勝手はマイノリティ・リポートのUIよりもさらに良さそう。

欲しいなあ。欲しいよう。欲しい。じゅるじゅる。

お値段、いかほどなんでしょうか・・・

Python 2.6のmultiprocessingではまる

2008-11-12 15:15:41 | プログラミング
Python 2.6のmultiprocessingモジュールのPoolを試してみました。

# 動作環境は、Windows Vista、Python 2.6、両方とも32bitです。

どうやら、apply_asyncの最初の引数として、ローカルにdefした関数を渡すとこけるようです。

くわばらくわばら。

実証コードを以下に。

---------------------------------------
import multiprocessing

def fg(x): print x * x

def test():
  pool = multiprocessing.Pool(4)
  
  def ff(x): print x * x
  
  for i in xrange(100):
    #pool.apply_async(fg, [ i ]) # これはOK
    pool.apply_async(ff, [ i ]) # こける
    
  pool.close()
  pool.join()

if __name__ == '__main__':
  test()
---------------------------------------

(追記)
公式サイトのバグリストに、似たような記述がありました。

http://bugs.python.org/issue3272

Poolのメソッドにlambdaを渡すとこける、という内容。

multiprocessing、まだ不安定なのかもしれません。

メモ: Scalaのお勉強 #5 ライブラリが・・・涙目

2008-11-11 17:03:57 | プログラミング
Scalaでそろそろまとまったコードを書こうかなあ~と思って、ファイルIOを調べてみると愕然。

Scalaの解説とかを見てると、テキストファイルからの読み込みに、

scala.io.Source

というクラスを使ってます。

名前からなんとなーくいやな感じが漂っていたのですが、(そしてそのときは無視していたのですが)

改めて、公式サイトのAPIリファレンスを見ると、案の定、ソースファイルを読み込むために作られた、などと書いてあります。

UTF8以外のエンコーディングを使いたいとか、バイナリファイルを読み書きしたいなら、java.io.なんたらを再利用してね、ということなのでしょう。

となると、ここでの選択肢は・・・

・Javaのクラスをそのまま使う。
利点 --> なんのかんの言っても「標準」なので、後から手を入れやすいだろう、といういこと。
欠点 --> せっかくScalaで書いても、Javaの回りくどいやり方を引きずってしまうこと。

・Javaのクラスをラップする。
利点 --> Scalaらしい簡潔なコードになるだろうこと。
欠点 --> 俺専用ラッパになるため、後から標準的なものが出てきたときに問題になりそうなこと。

あー、悩ましい。

BOF: 謎のPyPy

2008-11-10 21:58:54 | Birds-Of-Feather
PyPyというものを試してみた。

プリビルトバイナリというのが転がっていると知ったので。
http://codespeak.net/pypy/dist/pypy/doc/download.html

pypy-c(pypyでCにコンパイルされたCPythonのインタプリタ?)を起動して、

from test import pystone
pystone.main()

とやると、
Pystone(1.1) time for 50000 passes = 7.20778e-005
This machine benchmarks at 6.93694e+008 pystones/second
とかでる。

素のCPython 2.6だと、
Pystone(1.1) time for 50000 passes = 0.570637
This machine benchmarks at 87621.4 pystones/second
なので、

pypyの方が8×10^8くらい速い計算に。

本当ならすごいけど・・・

Y-combinator

2008-11-07 17:31:32 | プログラミング
Scalaの勉強を進めていくうちに、Combinator Parserなるものが出てきて、

Combinatorってなんじゃ?とか思って調べているうちに、Y-Combinatorなるものに行き当たりました。

Y-Combinatorとは、関数の不動点を求めるモノだそうです。

すなわち、関数Fが与えられたとき、p = F(p)となるような値pを求める関数がY-Combinatorです。p = Y(F)。

2つの式からpを消せば、Y(F) = F(Y(F))。

この式から何となく想像付くかもしれませんが、このYを使えば、再帰的に定義されている関数から、再帰呼び出しをくくり出すことができるそうです。

何となく分かったような分からないような。

参考:
http://code.activestate.com/recipes/576366/
http://igeta.cocolog-nifty.com/blog/2008/03/fixpoint.html

というわけで、実際これがどう使えるのか全く不明のまま。面白いけど。

こういうのは学生時代にやっておくべきだった。

メモ: Scalaのお勉強 #4 usingを書いてみる

2008-11-07 13:35:40 | プログラミング
記事「'Loan' pattern」
http://scala.sygneca.com/patterns/loan
を参考にして、

自分なりのusingを書いてみる。

--------------------------------

package disposetest

object Using {
  def using[ A, R <: { def dispose :Unit } ](r: R)(f: R => A): A = {
    try {
      f(r)
    } finally {
      r.dispose
    }
  }
}

class DisposableA {
  println("I'm created.")
  
  def greet = println("I'm working.")
  
  def dispose = println("I'm disposed.")
}

object Main {
  import Using._
  
  def main(args: Array[String]) {
    val d = new DisposableA()
    using(d) { d =>
      d.greet
    }
  }
}

--------------------------------

一応、うまく動いている様子。

structured typesはducktypingみたいで便利。