2016-08-22 6 views
2

指数演算のための負の実行時間:ここでnumpyの:私は2つの大きな行列を乗算しています、そしてそれは私が最初の最初の入力で、べき乗を実行するときの動作が速くなる判明

import time 
import numpy as np 

a = np.asarray(np.random.uniform(-1,1, (100,40000)), dtype=np.float32) 
b = np.asarray(np.random.uniform(-1,1, (40000,20000)), dtype=np.float32) 

start = time.time() 
d0 = np.dot(a,b) 
print "\nA.B   - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d1 = np.dot(np.exp(a), b) 
print "exp(A).B  - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d2 = np.dot(a, np.exp(b)) 
print "A.exp(B)  - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d3 = np.dot(np.exp(a), np.exp(b)) 
print "exp(A).exp(B) - {:.2f} seconds".format((time.time()-start)) 

結果は以下のとおりです。

A.B   1.27 seconds 
exp(A).B  1.15 seconds 
A.exp(B)  7.31 seconds 
exp(A).exp(B) 7.38 seconds 

私は間違っていることを誰でも説明することができますか、これはどのように可能ですか?

答えて

2

あなたが見ていることは、あなたがベンチマークしているときに一度だけの操作を実行することはない理由で、どのあなたがここで試みているもののようなものです。多くのことが、あなたが一度だけそれをやっているときに見ている結果に影響します。この場合、多分キャッシング効果があります。また、b配列は、非常に制御された環境で実行していない限り、とnp.exp(a)との結論を引き出すことができない配列よりもはるかに大きい配列です。np.exp(b)

これを適切にベンチマークするために、最後の2つのベンチマークを削減し、aexp(a)を重点的に取り上げることができます。また、我々は、操作を1万回を繰り返し、数分間待つことを避けるために配列のサイズを減らす:

import time 
import numpy as np 

a = np.asarray(np.random.uniform(-1,1, (100,400)), dtype=np.float32) 
b = np.asarray(np.random.uniform(-1,1, (400,2000)), dtype=np.float32) 

start = time.time() 
for i in xrange(10000): 
    d0 = np.dot(a,b) 
print "\nA.B   - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
for i in xrange(10000): 
    d0 = np.dot(np.exp(a), b) 
print "exp(A).B  - {:.2f} seconds".format((time.time()-start)) 

これは私のコンピュータ上で次のような結果が得られますご覧のとおり

A.B   - 7.87 seconds 
exp(A).B  - 13.24 seconds 

np.exp(a)を実行すると、予期したとおりにaにアクセスするよりも時間がかかります。

1

import time 
import numpy as np 

a = np.asarray(np.random.uniform(-1,1, (100,4000)), dtype=np.float32) 
b = np.asarray(np.random.uniform(-1,1, (4000,20000)), dtype=np.float32) 

start = time.time() 
d1 = np.dot(np.exp(a), b) 
print "exp(A).B  - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d0 = np.dot(a,b) 
print "A.B   - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d1 = np.dot(np.exp(a), b) 
print "exp(A).B  - {:.2f} seconds".format((time.time()-start)) 

start = time.time() 
d0 = np.dot(a,b) 
print "A.B   - {:.2f} seconds".format((time.time()-start)) 

実行の順序を逆にすることはまだ番目のステートメントは、同じ文の最初が、2番目の実行よりも速くなることになりますので、私は、メモリ・キャッシュの問題であるためにこれを疑いますもう一度速く走ってください。

exp(A).B  - 0.72 seconds 
A.B   - 0.70 seconds 
exp(A).B  - 0.70 seconds 
A.B   - 0.69 seconds 

(私はメモリの問題を回避するために、配列のサイズを小さくする必要がありました。)

関連する問題