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

2018年10月1日月曜日

Pythonで、.pycファイルや__pycache__ディレクトリを作らないようにする方法

Pythonはデフォルトで、クラスファイルをコンパイルした .pyc ファイルを作ります。Python 3系だと、__pycache__ディレクトリを自動的に作成して、その下に .pyc ファイルを作ります。

一度 .pyc ファイルを作っておけば、次回から、スクリプトの実行が少し速くなります。

ただし、スクリプトをこまめに変更する場合は、結局毎回コンパイルするので、あまり .pyc ファイルを保存しておく意味がありません。また、ディレクトリに勝手にファイルやディレクトリを作られると、ちょっとうざいです。git statusとかすると、untrackedなファイルとして表示されたりしますし。gitignoreしておけばいいのかもしれませんが、、、

ともかく、勝手にファイルやディレクトリを作ってほしくない場合は、環境変数に以下を追加しましょう。
export PYTHONDONTWRITEBYTECODE=1
これで、.pycファイルが作られなくなります。

bashを使っている場合は、.bashrcファイルの最後のあたりに、上記の設定を追加しておきましょう。これで、ログインしなおせばOKです。byobuとかscreenを使ってる場合は、一度terminateして、もう一度byobuやscreenを実行しましょう。


2018年9月30日日曜日

Pythonで最大値や最小値を求める方法

Pythonで最大値や最小値を求める方法を説明します。

Pythonにはmaxやminという関数がデフォルトで用意されており、これらの関数を使うことで、最大値や最小値を求めることができます。

以下がサンプルコードです。

print(max(1, 5))
print(max(10, 5, -3))

print(min(1, 5))
print(min(10, 5, -3))
これを実行すると、以下のようになります。
$ python hoge.py
5
10
1
-3
最大値や最小値が求められていることがわかります。

ちなみに、以下のように、配列を渡すこともできます。
print(max([1, 3, 5, 2]))

上記のコードを実行すると、5が出力されます。

Pythonで時間を測る方法

Pythonで時間を測る方法を紹介します。

ある処理にかかる時間を計測するための簡単な方法は、timeモジュールを使う方法です。以下がサンプルコードです。

import time

start = time.time() # 開始時刻

# 何かしらの処理
#  :
#  :

elapsedTime = time.time() - start
print("経過時間 " + str(elapsedTime) + " 秒")

これで、「何かしらの処理」にかかった時間を、単位=秒で計測できます。

上記のコードは、Python 3.5で動作を確認しています。

2018年2月1日木曜日

mpi4pyを使い、pythonでMPIプログラミング

PythonでMPIを使うライブラリとして、mpi4pyがあります。
その使い方を簡単に紹介します。

インストールは、例えばUbuntuなら以下のようにインストールできます。

$ sudo apt-get install python-mpi4py

mpi4pyを使ったプログラムについて紹介していきます。

from mpi4py import MPI

comm = MPI.COMM_WORLD

rank = comm.Get_rank()
print("rank " + str(rank))

numCores = comm.Get_size()
print("num cores " + str(numCores))

MPI.COMM_WORLDを実行すると、並列処理が始まります。
Get_rankメソッドで、スレッドのID (rank)を取得できます。IDは0始まりです。

if rank == 0:
  xxxx
else:
  yyyy

このように、スレッドIDに応じて処理を分けることができます。
また、Get_sizeメソッドで、いくつのスレッドが実行されているかを取得できます。

スレッド間で同期を取りたい場合は、barrierメソッドを使います。

comm.barrier()

これで、スレッドの処理がここ(barrierメソッドの内部)でいったん止まります。全てのスレッドが、barrierメソッドを呼び出すまで、処理が先に進みません。全てのスレッドがここに到達すると、せーので全スレッドが次の処理に向けて動き出します。

スレッド間でデータを交換する方法として最も単純なのは、sendメソッドとrecvメソッドです。

if rank == 0:
   data1 = 50
   comm.send(data1, dest=1, tag=23)
if rank == 1:
   data2 = comm.recv(source=0, tag=23)

sendメソッドで、データを送れます。上の例では、data1という変数を送っています。どのスレッドに送るかは、IDで指定します。上の例だと、スレッド0からスレッド1に送っています。tagは、交換するデータのIDです。たくさんのデータをやりとりする場合はデータにIDを振っておくと、recvする側は、受け取りたいデータを指定して受け取れます。

recvメソッドでデータを受け取ります。誰から受け取るかを、引数sourceで指定します。上の例だと、スレッド0からのデータ(ID=23)を受け取ろうとします。

これで、スレッド1の変数data2には、50という値が格納されます。

mpi4pyを使ったプログラムは、以下のようにmpiexecコマンドを使って実行できます。
以下は、run-mpi-app.pyというプログラムを、4スレッドで実行する例になります。

mpiexec -n 4 python run-mpi-app.py

2018年1月2日火曜日

Python3でプログラムの実行時間を計測する方法

Python3でプログラムの実行時間を計測する方法を紹介します。

以下は、timeモジュールを利用した計測方法です。
import time

start = time.time()
time.sleep(3)
finish = time.time()
print(finish - start)
以下は実行結果です。
3.0009043216705322

time.time()で、タイムスタンプを取得できます(単位は秒)。
計測したい処理の開始前と開始後にtime.time()を実行し、その差を計算すれば、それが実行時間となります。

先ほどのサンプルコードでは、3秒間スリープさせているので、実行時間は、ほぼ3秒になります。

Pythonのfor文

Pythonのfor文の使い方を紹介します。

まず最初に、rangeを使う方法です。
for i in range(3):
    print(i)
実行結果は以下です。
0
1
2
このように、rangeでXを指定すると、0から(X-1)までループします。

次に、もう一つのrangeの使い方。
for i in range(2, 6):
    print(i)
実行結果は以下です。
2
3
4
5
rangeで2つの値(X,Y)を指定すると、Xから(Y-1)までループします。

続いて、リストを使ってループさせる方法。
vals = [1, 5, 7, 9, 11]
for v in vals:
    print(v)
実行結果は以下です。
1
5
7
9
11

リストを指定すると、リストの最初から最後までループします。

Pythonで引数を受け取る方法

Pythonで引数を受け取る方法を紹介します。

Pythonで引数を受け取るには、sysモジュールをimportします。
import sys

def usage_and_exit():
    print("""
USAGE: python test.py [filename]
    """)
    sys.exit(-1)

args = sys.argv
if len(args) != 2:
    usage_and_exit()

filename = args[1]

sys.argvが引数のリストです。
argvの最初の要素(上記プログラムだとargs[0])には、実行中のスクリプトが格納されています。なので、通常、スクリプトの引数は2つ目の要素から格納されることになります。

上記のサンプルコードでは、引数のリストのサイズをチェックして、サイズが2じゃなかったら(引数が1個指定されていない場合)、usageを表示して、プログラムを終了するようにしています。

プログラムの終了は、sys.exitで可能です。

以下は引数を処理するサンプルコードになります。

import sys

# 引数の配列を取得
args = sys.argv

for i, arg in enumerate(args):
    if arg == "-a":
        argA = args[i+1]
    elif arg == "-b":
        argB = args[i+1]
   

sys.argv で、引数の配列を取得できます。そのあと、forループで引数を処理しています。上のサンプルコードの名前が hoge.py だとすると、以下のように実行する想定です。

$ python hoge.py -a 50 -b 100

これで、変数argAに50が、変数argBに100が代入されます。

2017年12月30日土曜日

Python 3で、ファイルの文字列を読み込む方法

Pythonでファイルの文字列を読み込み方法を紹介します。

以下のサンプルコードは、sample.datというファイルを読み込み、一行ずつ出力します。

filename = "sample.dat"

with open(filename) as f:
    line = f.readline().strip() # 一行読み込み、かつ、改行を削除
    while line:
        print(line)
        line = f.readline().strip()

"with open..."でファイルを読み込むことで、いちいちcloseメソッドを呼ばなくても勝手にファイルを閉じてくれます。

また、readline関数で、ファイルを読み込んだ後に、strip関数で改行を削除しています。

Python 3で、組み合わせの一覧を求める方法

Python 3で組み合わせを計算する方法を紹介します。

組み合わせの総数の求め方は、確か、高校で習うはずで、簡単です。たとえば、ここに書いてあります。一方、その全ての組み合わせを求めるアルゴリズムは、少し複雑です。が、Pythonのライブラリを使えば、その複雑さを気にせずに組み合わせを求めることができます。Python最高ですね(笑

以下のサンプルコードでは、組み合わせの候補(4個)から、3個を選択する全ての組み合わせを求めて、出力します。

import itertools

# 組み合わせの候補
s = ['1','2','3','4']

# 組み合わせをもとめて、リストとして取得
patterns = list(itertools.combinations(s, 3));

# 組み合わせを表示
for p in patterns:
    print(p)
実行すると以下が出力されます。
('1', '2', '3')
('1', '2', '4')
('1', '3', '4')
('2', '3', '4')

JavaScriptで10進数と16進数を変換する方法

JavaScriptで10進数と16進数を変換する方法を紹介します。 まず、16進数を、10進数に変換する方法です。 以下のサンプルコードでは、16進数の"DB"や"0A"を、10進数に変換しています。 var a = pa...