Почему scipy.distance.cdist имеет большую разницу в производительности между использованием float32 (медленнее) и float64 (быстрее)? - PullRequest
0 голосов
/ 03 июня 2018

Почему 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)

На моем компьютере этот код выдает временные значения 130.6998474597931 для float32 и 22.450339794158936 для float64, колоссальные 6xразница. В чем причина такой большой разницы в том, что float64 быстрее, чем float32?

Однако, как представляется, разрыв становится все меньше и меньше, если вместо b задано значение np.пусто ((1, 512)), b равно np.empty ((k, 512)), причем k (> 1) становится все больше и больше.Например, когда k = 5, я получаю 222.25975680351257 для float32 и 110.36117148399353 для float64 (2x). Почему разрыв становится меньше, когда k становится больше?

1 Ответ

0 голосов
/ 04 июня 2018

Базовый код C, который фактически выполняет вычисления, реализован с использованием переменных C double, которые представляют собой 64-битные значения с плавающей запятой.Когда вы передаете массивы np.float32, данные должны быть скопированы.

Для второй части вашего вопроса: больше k означает больше работы, поэтому затраты на копирование данных составляют меньшую долюобщее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...