Редактировать: Какие единицы измерения времени?Я считаю, что вы сравнили их, поскольку они все были в одном блоке.Возможно, dtw.distance, например, в микросекундах, а остальные ответы - в миллисекундах, и вы подумали, что dtw.distance работает медленнее, когда на самом деле все наоборот.
Существуют разныеметодики измерения расстояния между двумя точками.Это может быть основано на стандартном отклонении или просто евклидовом расстоянии.Вот список многих из этих расстояний.
Некоторые из них могут быть более вычислительными, чем другие, и также имеют разные значения.Fast dtw, например, использует в качестве третьего входа желаемый тип расстояния, как описано на их github
distance3, path3 = fastdtw(s1, s2, dist = euclidean)
Другая причина разницы в скорости - это основной код.Некоторые из них в чистом Python, а другие в C, что может быть легко в 100 раз быстрее.Способ ускорить ваше расстояние - установить максимальный порог расстояния.Алгоритм остановит вычисление, если поймет, что общее расстояние будет выше определенного значения:
distance2 = dtw.distance_fast(array.array('d',s1),array.array('d',s2), max_dist = your_threshold)
Также важно отметить, что некоторые из них могут быть оптимизированы для более длинных или более коротких массивов.Глядя на приведенный ниже пример и запустив его на своем компьютере, я нахожу разные результаты:
from cdtw import pydtw
from dtaidistance import dtw
from fastdtw import fastdtw
from scipy.spatial.distance import euclidean
s1=np.array([1,2,3,4],dtype=np.double)
s2=np.array([4,3,2,1],dtype=np.double)
%timeit dtw.distance_fast(s1, s2)
4.1 µs ± 28.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit d2 = pydtw.dtw(s1,s2,pydtw.Settings(step = 'p0sym', window = 'palival', param = 2.0, norm = False, compute_path = True)).get_dist()
45.6 µs ± 3.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit d3,_=fastdtw(s1, s2, dist=euclidean)
901 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
fastdtw
в 219 раз медленнее, чем dtaidistance
lib, и в 20 раз медленнее, чем cdtw