为什么scipy.distance.cdist在使用float32(慢)和float64(更快)之间有很大的性能差异?

时间:2018-06-03 16:40:52

标签: python performance numpy scipy

为什么scipy.distance.cdist在使用float32和float64之间有很大的性能差异?

from scipy.spatial import distance
import numpy as np
import time

a_float32 = np.empty((1000000, 512), dtype=np.float32)
b_float32 = np.empty((1, 512), dtype=np.float32)
a_float64 = np.empty((1000000, 512), dtype=np.float64)
b_float64 = np.empty((1, 512), dtype=np.float64)

t1 = time.time()
for i in range(100):
    distance.cdist(a_float32, b_float32, "sqeuclidean")
t2 = time.time()
print(t2-t1)
t1 = time.time()
for i in range(100):
    distance.cdist(a_float64, b_float64, 'sqeuclidean')
t2 = time.time()
print(t2-t1)

在我的计算机上,此代码为float32生成130.6998474597931,为float64生成22.450339794158936,差异高达6倍。 浮动64比浮动速度快得多的原因是什么?

然而,如果不是b是np.empty((1,512)),则间隙似乎变得越来越小,b是np.empty((k,512)),其中k(> 1)变大并且大。例如,当k = 5时,对于float32,我得到222.25975680351257,对于float64(2x),我得到110.36117148399353。 为什么当k变大时间隙会变小?

1 个答案:

答案 0 :(得分:2)

实际执行计算的基础C代码是使用C double变量实现的,这些变量是64位浮点值。传入np.float32数组时,必须复制数据。

对于问题的第二部分:较大的k意味着更多的工作,因此复制数据的开销只占总时间的一小部分。