2009年2月28日土曜日

統計について

勉強したい今日この頃。

とりあえず、今やってる研究の関係で、
5段階でとったアンケートの検証方法について知りたい。

例えば、2つシステムがあって、両者の比較をするなら
同じ質問項目(i.e. 使いやすかったですかー?とか)に
それぞれ答えてもらって、その結果を符号検定すれば済むんだけど。

問題は質問が1回しかない場合なんだよね。
そもそもそういう風に実験をセッティングする事自体に
問題があるのかもしれないけど。。。

とりあえず、今はアンケートの5段階それぞれに1,2,3,4,5と点数をつけて、
本来の平均は3になりますが、
有意水準1%で左片側検定をした結果では…
とか言ってる。

サンプル数は100を超えてるから、
サンプル自体が大標本としては使えるんだけど。。。

果たしてこれは正しいんだろうか??

[Python] 条件付評価式

Python2.5から使用可能な条件付評価式 (Conditional Expressions) 。
とってきたBK Treeのプログラム中にあった。

つまりは一行で書けるif-else構文のこと。(代入限定)

>>> a = 1
>>> a = 2 if a == 1 else 3
>>> a
2

普通の表記だと、以下のようになる。

>>> a = 1
>>> if a == 1:
...   a = 2
... else:
...   a = 3
>>> a
2

Python2.5をいれているので実行は普通に出来るんだけど
Eclipseの自動構文チェックではエラー扱いになってる。

何でだろう?
Pydevが古いのかな。
そういや、アップデートをエラーのまま放置してる。。。

2009年2月27日金曜日

[Python] 標準出力の文字化け対策 in Windows

今まで無視していた標準出力の文字化けを直す。

Windowsの標準出力で文字化けが起こる場合、
基本的にはShift_JIS(cp932)にエンコードすればOK。

ちなみにうちの開発環境はeclipse。

[コード例] 
keyword = "図書館戦争" 
print keyword.encode('cp932')

[出力]
図書館戦争

無事出力☆
でも、sitecustomize.py、defaultencoding、Eclipseワークスペース、
ソースファイル全てのエンコードにutf-8を設定しているのに
何でこんなことになるんだろう??

答えはWindowsのMS-DOSで解決。
Windowsの標準コードはShift_JISなので、
標準出力についてはそっちに依存してたんだと納得。

C\:> chcp
現在のコード ページ: 932

実際、pythonの標準入力・出力系の文字コードを確認してみると、
cp932であることが確認できた。

>>> sys.stdin.encoding
'cp932'
>>> sys.stdout.encoding
'cp932'
>>> sys.stderr.encoding
'cp932'

内部でどうなっているかは分からないけど、
今後入出力はcp932で行なう事を意識する。

2009年2月26日木曜日

[Python] threadingモジュールを使ってみる

Pythonでスレッドを使う方法は
  • threadをimportしてthread.start_new_thread(func, args)にスレッドとして動かした関数を指定。
  • スレッド化したいクラスで、threading.Treadを継承する
の2通り。(私が使ったことあるのは。)

threadはスレッドの終わりを検知する機能が無い。
=メインメソッドの実行が終わると、実行途中でも中断されてしまう。
(これを無理やり同期取ろうとするとwhile文でチェックし続けるとか
アホなコードになってしまいました。)

threadingではスレッドの実行終了のタイミングまで、実行を一時停止する機能がある。

[使用例]
import threading
import time

class testTreading(threading.Thread):
  def run(self):
    for i in range(1, 5):
      print i
      time.sleep(2)

r = registerRelationShip()
r.start()
r.join(1000) #スレッドの終了までの待ち時間
print "end"

[出力]
1
2
3
4
end

実行したい内容はrun()メソッドに書いて、
それをstart()メソッドで実行させる。

join()メソッドでスレッドの終了を待つので、
endが出力されるのは一番最後。

こっちの方が使い勝手良さそうかな。

[Python] __slots__の用法

メモリ節約&実行速度向上のため、__slots__を使ってみる。

__slots__
  • クラスのアトリビュートの一種
  • __slots__にString型で変数名を代入すると、それ以外のインスタンス変数が使えなくなる

[コード例]
class test(object):
  __slots__ = ['foo', 'bar']

  def printFoo():
    print self.foo

  def setFoo(_foo):
    self.foo = _foo

t = test()
t.setFoo(20)
t.printFoo()

t.bar = 30
print t.bar

[出力]
20
30

  • クラス内にメソッドも追加できる
  • 書きこみも勿論可☆
どのくらい速度向上するとかの、検証はしてない。