Numpy:指数运算的负执行时间
Numpy: Negative Execution Time for exponentiation operation
我正在将两个大矩阵相乘,事实证明当我第一次对第一个输入执行幂运算时运算速度更快:
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
任何人都可以解释我做错了什么,或者这怎么可能?
我怀疑这是内存缓存问题,因为颠倒了执行顺序
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))
仍然会导致第二个语句比第一个快,但是相同语句的第二次执行 运行 第二次也会更快。
exp(A).B - 0.72 seconds
A.B - 0.70 seconds
exp(A).B - 0.70 seconds
A.B - 0.69 seconds
(我不得不减小数组的大小以避免内存问题。)
您所看到的是为什么您在进行基准测试时永远不会 运行 一次操作的原因,这正是您在这里尝试的。当你只做一次时,很多事情都会影响你看到的结果。在这种情况下,可能有一些缓存效果。此外,b 数组比 a 数组大得多,以至于在执行 np.exp(b)
时无法用 a
vs np.exp(a)
得出任何结论,除非你在 运行ning 中非常受控的环境。
为了更恰当地对此进行基准测试,我们可以削减最后两个基准并专注于 a
与 exp(a)
。此外,我们重复操作 10,000 次并减少数组的大小以避免等待几分钟:
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
花费的时间要多,这是预期的。
我正在将两个大矩阵相乘,事实证明当我第一次对第一个输入执行幂运算时运算速度更快:
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
任何人都可以解释我做错了什么,或者这怎么可能?
我怀疑这是内存缓存问题,因为颠倒了执行顺序
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))
仍然会导致第二个语句比第一个快,但是相同语句的第二次执行 运行 第二次也会更快。
exp(A).B - 0.72 seconds
A.B - 0.70 seconds
exp(A).B - 0.70 seconds
A.B - 0.69 seconds
(我不得不减小数组的大小以避免内存问题。)
您所看到的是为什么您在进行基准测试时永远不会 运行 一次操作的原因,这正是您在这里尝试的。当你只做一次时,很多事情都会影响你看到的结果。在这种情况下,可能有一些缓存效果。此外,b 数组比 a 数组大得多,以至于在执行 np.exp(b)
时无法用 a
vs np.exp(a)
得出任何结论,除非你在 运行ning 中非常受控的环境。
为了更恰当地对此进行基准测试,我们可以削减最后两个基准并专注于 a
与 exp(a)
。此外,我们重复操作 10,000 次并减少数组的大小以避免等待几分钟:
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
花费的时间要多,这是预期的。