ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2012年1月29日日曜日

python:デコレータ




参考サイトは
http://satoshi.blogs.com/life/2009/11/python%E5%85%A5%E9%96%80%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%AF.html

このエントリーをはてなブックマークに追加



2012年1月21日土曜日

Python:MyMPIで円周率の計算バージョン1



def f(x):
    return 4.0/(1.0+x*x)


def main():
    import numpy
    import mpi
    from mpi import mpi_init, mpi_finalize
    from mpi import mpi_comm_size, mpi_comm_rank, MPI_COMM_WORLD
    from mpi import mpi_reduce, mpi_bcast, mpi_barrier,mpi_recv, mpi_send
    from mpi import MPI_SUM, MPI_FLOAT,MPI_INT,MPI_TAG_UB
    import sys

    sys.argv = mpi_init(len(sys.argv),sys.argv)

    number_of_proc = mpi_comm_size(MPI_COMM_WORLD)
    myid = mpi_comm_rank(MPI_COMM_WORLD)
    main_node = 0
    n = 10000
    
    #mpi_bcast(n, 1, MPI_INT, 0, MPI_COMM_WORLD)

    h = 1.0 / n
    sum = 0.0

    for i in range(myid,n,number_of_proc):
        x = h * (i -0.5)
        sum += f(x)

    mypi = h * sum

    #mpi_barrier(MPI_COMM_WORLD)
    
    cpi = mpi_reduce(mypi, 1, MPI_FLOAT,MPI_SUM, 0, MPI_COMM_WORLD)

    if myid == main_node:
        print cpi
    
    mpi_finalize()

if __name__=="__main__":
    main()

結果は [ 3.14179277] 

お試しあれ。


このエントリーをはてなブックマークに追加



2012年1月20日金曜日

Python でお気楽並列コンピューティング:MYMPIの使い方




example1.py
import numpy
from numpy import *
import mpi
from mpi import *
import sys
sys.argv = mpi.mpi_init(len(sys.argv),sys.argv)
print "after ",len(sys.argv),sys.argv
myid=mpi.mpi_comm_rank(mpi.MPI_COMM_WORLD)
numprocs=mpi.mpi_comm_size(mpi.MPI_COMM_WORLD)
print "Hello from ",myid
print "Numprocs is ", numprocs
print "python is not about snakes"
mpi.mpi_finalize()

mpirun --hostfile hosts -np 40 python example1.py

hosts ファイルの書き方

hoge@192.168.1.11 cpu=4 
hoge@192.168.1.12 cpu=4 
hoge@192.168.1.15 cpu=4
hoge@192.168.1.16 cpu=4 
hoge@192.168.1.17 cpu=4 
hoge@192.168.1.19 cpu=4 
hoge@192.168.1.20 cpu=4 
hoge@192.168.1.23 cpu=8 
hoge@192.168.1.24 cpu=16

とすること

server1@~/test_mympi> mpirun -host hoge@192.168.1.14 -np 3 python example1.py
Traceback (most recent call last): File "example1.py", line 2, in import numpy ImportError: No module named numpy Traceback (most recent call last): Traceback (most recent call last): File "example1.py", line 2, in import numpy ImportError: No module named numpy File "example1.py", line 2, in import numpy ImportError: No module named numpy

となぜかnumpyを認識していないノードはhostsファイルから除く。
後日なぜかを調査予定。


うまくいくと、以下のようになる


server1@~/test_mympi> mpirun --hostfile hosts -np 10 python example1.py
[puzzle15:26782] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27440] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle15:26783] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23530] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27439] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27441] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle11:27442] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23529] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23531] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
[puzzle12:23532] mca: base: component_find: unable to open osc pt2pt: file not found (ignored)
after  1 ('example1.py',)
Hello from  6
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  8
after  1 ('example1.py',)
Hello from  2
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  0
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  3
Numprocs is  10
python is not about snakes
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  9
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  4
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  5
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  7
Numprocs is  10
python is not about snakes
after  1 ('example1.py',)
Hello from  1
Numprocs is  10
python is not about snakes

このエントリーをはてなブックマークに追加



Python でお気楽並列コンピューティング:MYMPIのインストール



http://sparx-em.org/sparxwiki/MPI-installation
からMYMPIをインストールしてきて展開。

python 2.5.2
openmpi-1.2.8

が入っていれば、
python install_mpi.py --mpiroot=/home/openmpi/
でオッケー。

私はtcshを使っているので、.cshrc ファイルに
setenv LD_LIBRARY_PATH $HOME/openmpi/lib
とパスを通しておく。

これで
python
import mpi
としてうまく行けばオッケー。



このエントリーをはてなブックマークに追加



2012年1月19日木曜日

Python でお気楽並列コンピューティング:openmpi-1.2.8 のインストール



今、MYMPIを使おうと四苦八苦していますが、
その覚え書きを書いていく。

まず、openmpi-1.2.8の導入で躓いた。
libtool のバージョンが違うというエラー。
コンピュータのlibtoolのバージョンは1.5.8。
2.1aを要求されているようなので、libtoolのサイトに探しに行ったが、
無い。
仕方なく2.4.2なるものを入れてみたがやっぱりこけた。
2.2.2にしてもこける。

make distclean でフォルダーを初期化(make maintainer-clean)。

make distclean
autoreconf --force --install
./configure --enable-shared --prefix=/home/openmpi/
make
make install

make のところでやっぱりこける。

../../libtool: line 463: CDPATH: command not found
../../libtool: line 1266: func_opt_split: command not found
libtool: Version mismatch error.  This is libtool 2.1a, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.1a
libtool: and run autoconf again.

なんやねん!

[追記]
さらにググってみる。
m4のバージョンが1.4.11だけどこれがだめなのか????
http://blog.k-tai-douga.com/article/26604536.html

libtoolまわりを疑ったがどうやら
tarballからの展開してインストールするのにauto tools は必要ないらしい。
(openmpi Q&Aより。)

そこでもう一度tarballの展開からはじめて見た。

tar jxf openmpi-1.2.8.tar.bz2
cd openmpi-1.2.8
./configure --enable-shared --prefix=/home/openmpi/
make all install
なんと通った。

考察
make all install が有効だった?(make  make installではなく)
結局なんで最初うまくいかず、今回うまくいったのかよくわからないけど。。。。

良かったー ;-)

[自分用メモ書き]
tar jxf openmpi-1.2.8.tar.bz2


参考サイト
http://www.fireproject.jp/feature/automake/basic/intro.html





このエントリーをはてなブックマークに追加



Python でお気楽並列コンピューティング:MYMPIとpyMPIの違い



両者はmpi のpython ラッパーであるが、その違いは。。。。

pyMPI はモジュールを伴ったPython インタプリタでありMPI_Initを明示的に呼び出すことはない。
mympi は明示的にMPI_Initを呼ぶ。つまり、より細かく、MPI_Initを呼び出すタイミングを制御できる。また、MYMPIはインタプリタではなく単なるモジュールなため、それだけサイズがちいさい。
このエントリーをはてなブックマークに追加



2011年12月29日木曜日

Pythonでお気楽並列コンピューティング2: mpi4py





python master.py
3.14160098692

master.py
masterとしてはたらく

#!/usr/bin/env python
from mpi4py import MPI
import numpy
import sys

comm = MPI.COMM_SELF.Spawn(sys.executable,
                           args=['cpi.py'],
                           maxprocs=5)

N = numpy.array(100, 'i')
comm.Bcast([N, MPI.INT], root=MPI.ROOT)
PI = numpy.array(0.0, 'd')
comm.Reduce(None, [PI, MPI.DOUBLE],
            op=MPI.SUM, root=MPI.ROOT)
print(PI)

comm.Disconnect()



cpi.py
#!/usr/bin/env python
from mpi4py import MPI
import numpy

comm = MPI.Comm.Get_parent()
size = comm.Get_size()
rank = comm.Get_rank()

N = numpy.array(0, dtype='i')
comm.Bcast([N, MPI.INT], root=0)
h = 1.0 / N; s = 0.0
for i in range(rank, N, size):
    x = h * (i + 0.5)
    s += 4.0 / (1.0 + x**2)
PI = numpy.array(s * h, dtype='d')
comm.Reduce([PI, MPI.DOUBLE], None,
            op=MPI.SUM, root=0)

comm.Disconnect()


このエントリーをはてなブックマークに追加



Pythonでお気楽並列コンピューティング: mpi4py



我がMacbook Airでは
easy_install mpi4py
で自動的にmpi4py 1.2.2がダウンロード&インストールされる。
簡単すぎて、pythonでのインストールの仕方&仕組みを忘れそう。怖い。

次にプログラム

プログラム1
#!/usr/bin/env python
"""
Parallel Hello World
"""

from mpi4py import MPI
import sys

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

print "Hello, World! I am process %d of %d on %s." % (rank, size, name)



実行結果

mpirun -np 4 python helloworld2.py
Hello, World! I am process 1 of 4 on MacBook-Air.local.
Hello, World! I am process 2 of 4 on MacBook-Air.local.
Hello, World! I am process 0 of 4 on MacBook-Air.local.
Hello, World! I am process 3 of 4 on MacBook-Air.local.













このエントリーをはてなブックマークに追加



2011年12月9日金曜日

python 多次元配列 リストではまる




>>> a = [[] for i in xrange(4)]
>>> a
[[], [], [], []]
>>> b = [a for i in xrange(3)]
>>> b
[[[], [], [], []], [[], [], [], []], [[], [], [], []]]
>>> b[0][0]=1
>>> b[2][0]=10
>>> b[1][0]=2
>>> b
[[2, [], [], []], [2, [], [], []], [2, [], [], []]]

なんでこうなるの?

このエントリーをはてなブックマークに追加



2011年12月8日木曜日

numpy.sort




import numpy
>>> x =[[6,5],[4,3],[2,8]]
>>> y = numpy.array(x)
>>> y.sort(0)
>>> y
array([[2, 3],
       [4, 5],
       [6, 8]])


>>> y = numpy.array(x)
>>> y.sort()
>>> y
array([[5, 6],
       [3, 4],
       [2, 8]])

lexsort()
が便利そう。

このエントリーをはてなブックマークに追加



2011年12月6日火曜日

python でのpickleの使い方




pickle はとても便利なモジュールです。
何にいいかというと、新規プログラムを作成して
いるときに、テストデータとしてpickle.dump した
データを使うとよいです。
しかも、オブジェクトなら何でも保存できますからとても
便利です。
私は、プログラムを作るときにテストするためのデータをdump
しておきそれを入力データとしてテストプログラムで走らせます。
例えばscipyやnumpyでつくったarray等。


def pickle_dump_arr(arr,name):
import pickle
f = open('%s.dump'%name,'w')
pickle.dump(arr,f)
f.close


def pickle_load_arr(name):
import pickle
f = open('%s.dump'%name)
arr = pickle.load(f)
return arr


このエントリーをはてなブックマークに追加



2011年12月5日月曜日

python 3次元配列の作り方




1番目の方法
>>> a = [[] for i in xrange(5)]
>>> b = [a for i in xrange(90)]
>>> c = [b for i in xrange(981)]
>>> d = numpy.array(c)
>>> d
array([], shape=(981, 90, 5, 0), dtype=float64)
>>>d.shape
(981,90,5,0)

2番目の方法
a = numpy.zeros([981,90,5])
a.shape
(981, 90,5)

a[0][0] = ([1,2,3,4,5])

このエントリーをはてなブックマークに追加