np.float64和np.double有什么区别?

时间:2017-04-28 12:00:50

标签: python numpy precision

我尝试运行以下代码,以找出float64doublenumpy之间的区别。结果很有趣,因为与使用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'

3 个答案:

答案 0 :(得分:7)

我认为你将苹果与橙子进行比较。

第一个工作台基本上是a * b,但是第二个a * a

我怀疑后者的缓存丢失要少得多。

答案 1 :(得分:4)

import numpy as np
np.double is np.float64 # returns True

理论上两者都应该相同。

答案 2 :(得分:1)

许多数组操作通常仅受限于将数组元素从RAM加载到缓存所需的时间。

因此,如果每个值的大小较小,或者您不需要在缓存中加载如此多的元素,那么您希望操作更快。

这就是为什么你的时间不同:np.float64np.double实际上并不复制,所以在第一种情况下,数组是相同的,而不是第二种情况:

>>> da is db
True

>>> dda is ddb
False

因此,可以优化第一种情况,因为您不需要从两个数组加载值,而只需加载一个数组。从而使带宽倍增。

但是还有另外一件事要考虑:np.float64np.double在大多数机器上应该是相同的,但这并不是保证。 np.float64是固定大小的浮点值(始终为64位),而np.double取决于计算机和/或编译器。在大多数机器double64bit都是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);