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

4 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)
Run Code Online (Sandbox Code Playgroud)

在我的计算机上,此代码为 float32 生成的计时为 130.6998474597931,为 float64 生成的计时为 22.450339794158936,相差 6 倍之多。float64 比 float32 快,差异如此之大的原因是什么?

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

War*_*ser 5

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

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