python

Unicode
Windows と Linux で同じ python プログラムを実行しようとして日本語の文字化け。
python 2 系を使っているので文字列に u プリフィックスをつければ解決。

print u"for 文"

numpy
やりたかったことは numpy のサンプルを動かしたときの print 出力で、慣れない言語だとそこの習慣がまだよくわかっていない。

# -*- coding: utf-8 -*-
# http://japanichaos.appspot.com/NumpyArray.html

import numpy as np
import time

# a = np.array([1,2,3,4,5])
# b = np.array([6,7,8,9,10])
# for i in range(5):
# 	print(a[i] + b[i])

# ランダムな配列を作る
count = 10**7
print count, u"回分の足し算にかかる時間"

a = np.random.random(count)
b = np.random.random(count)

#
# for 文の要素アクセスによる演算は遅い
#
start = time.time()
for i in range(count):
	a[i] + b[i]
elapsed_time = time.time() - start
print u"for 文"
print elapsed_time, u"sec."

#
# 直接の足し算の方が速い
#
start = time.time()
a + b
elapsed_time = time.time() - start
print "a + b"
print elapsed_time, "sec."

それぞれ、Windows7(Core i7 860 2.8GHz) と CentOS7(Core i7-4790K 4.0GHz) で試してみると、

Windows7

> python array.py
10000000 回分の足し算にかかる時間
for 文
3.79099988937 sec.
a + b
0.0460000038147 sec.

CentOS7

$ python array.py
10000000 回分の足し算にかかる時間
for 文
2.09633088112 sec.
a + b
0.0219371318817 sec.

numpy.ndarray の足し算の方が for ループに比べて速いのがわかるし、流石に 4790K は速い。

print 文は、複数の引数を連続して出力したい場合「,」で区切ってつなげればいいらしい。言語によって「+」で連結するものもあるし、これは言語ごとに覚えて慣れるしかないか。

zip
ついでに zip のサンプル。

list1 = [1,2,3]
list2 = [2,3,4]
list3 = [5,6,7]

for (a, b, c) in zip(list1, list2, list3):
    print a, b, c

for (a, b, c) in zip(list1, list2, list3):
    print (a+b+c)

3 つのリストをそれぞれ独立に回せる。

>>> list1 = [1,2,3]
>>> list2 = [2,3,4]
>>> list3 = [5,6,7]
>>>
>>> for (a, b, c) in zip(list1, list2, list3):
...     print a, b, c
...
1 2 5
2 3 6
3 4 7
>>> for (a, b, c) in zip(list1, list2, list3):
...     print (a+b+c)
...
8
11
14

enumrate
enumrate 関数はループする際にインデックスを得られる。

list4 = ['a', 'b', 'c']
for (i, x) in enumerate(list4):
	print i,x
>>> list4 = ['a', 'b', 'c']
>>> for (i, x) in enumerate(list4):
...     print i,x
...
0 a
1 b
2 c

zip + enumrate
zip と enumrate をあわせるとこんな感じ。

listA = [10,20,30]
listB = [20,30,40]
samples = zip(listA, listB);
print samples

for i, (a, b) in enumerate(samples):
	print i, ":", a, b
>>> listA = [10,20,30]
>>> listB = [20,30,40]
>>> samples = zip(listA, listB);
>>> print samples
[(10, 20), (20, 30), (30, 40)]
>>>
>>> for i, (a, b) in enumerate(samples):
...     print i, ":", a, b
...
0 : 10 20
1 : 20 30
2 : 30 40

C# で foreach を使うときに index を得たいことがあるけど、この python の enumrate は便利そうだとふと思った、、、いや、c# でも for 文使えばいいのか…?いやいや、そうなると foreach で KeyValurPair を使う便利さを相殺するか。短い構文でかけるのは便利だ。

References:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です