我尝试运行以下代码,以找出float64
中double
和numpy
之间的区别。结果很有趣,因为与使用float64
进行乘法所花费的时间相比,double类型的时间几乎翻倍。需要注意一点。
import time
import numpy as np
datalen = 100000
times = 10000
a = np.random.rand(datalen)
b = np.random.rand(datalen)
da = np.float64(a)
db = np.float64(a)
dda = np.double(a)
ddb = np.double(b)
tic = time.time()
for k in range(times):
dd = dda * ddb
toc = time.time()
print (toc - tic), 'time taken for double'
tic = time.time()
for k in range(times):
d = da * db
toc = time.time()
print (toc - tic), 'time taken for float64'
答案 0 :(得分:7)
我认为你将苹果与橙子进行比较。
第一个工作台基本上是a * b
,但是第二个a * a
。
我怀疑后者的缓存丢失要少得多。
答案 1 :(得分:4)
import numpy as np
np.double is np.float64 # returns True
理论上两者都应该相同。
答案 2 :(得分:1)
许多数组操作通常仅受限于将数组元素从RAM加载到缓存所需的时间。
因此,如果每个值的大小较小,或者您不需要在缓存中加载如此多的元素,那么您希望操作更快。
这就是为什么你的时间不同:np.float64
和np.double
实际上并不复制,所以在第一种情况下,数组是相同的,而不是第二种情况:
>>> da is db
True
>>> dda is ddb
False
因此,可以优化第一种情况,因为您不需要从两个数组加载值,而只需加载一个数组。从而使带宽倍增。
但是还有另外一件事要考虑:np.float64
和np.double
在大多数机器上应该是相同的,但这并不是保证。 np.float64
是固定大小的浮点值(始终为64位),而np.double
取决于计算机和/或编译器。在大多数机器double
上64bit
都是double
,但并不总是保证!因此,如果您的float64
和>>> np.double(10).itemsize
8
>>> np.float64(10).itemsize
8
>>> np.float64 is np.double
True
宽度不同,则可能存在速度差异:
PlaySound("./backgrounMusic.wav", NULL, SND_ASYNC ) //this is my main music for my game
PlaySound("./buttonEffect.wav", NULL, SND_FILENAME | SND_ASYNC);