距离向量算法 java_高效精确地计算欧氏距离

作为一般的经验法则,尽可能坚持 scipy 和 numpy 实现,因为它们被矢量化并且比本机Python代码快得多 . (主要原因是:在C中实现,向量化消除了循环所做的类型检查开销 . )

(旁白:我的答案不包括这里的精度,但我认为同样的原则适用于效率的精确度 . )

作为一个奖励,我重新使用IPython解释器,秘诀是使用 %prun 线魔术 .

In [1]: import numpy

In [2]: from scipy.spatial import distance

In [3]: c1 = numpy.array((52, 106, 35, 12))

In [4]: c2 = numpy.array((33, 153, 75, 10))

In [5]: %prun distance.euclidean(c1, c2)

35 function calls in 0.000 seconds

Ordered by: internal time

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 0.000 0.000 {built-in method builtins.exec}

1 0.000 0.000 0.000 0.000 linalg.py:1976(norm)

1 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.dot}

6 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.array}

4 0.000 0.000 0.000 0.000 numeric.py:406(asarray)

1 0.000 0.000 0.000 0.000 distance.py:232(euclidean)

2 0.000 0.000 0.000 0.000 distance.py:152(_validate_vector)

2 0.000 0.000 0.000 0.000 shape_base.py:9(atleast_1d)

1 0.000 0.000 0.000 0.000 misc.py:11(norm)

1 0.000 0.000 0.000 0.000 function_base.py:605(asarray_chkfinite)

2 0.000 0.000 0.000 0.000 numeric.py:476(asanyarray)

1 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}

1 0.000 0.000 0.000 0.000 linalg.py:111(isComplexType)

1 0.000 0.000 0.000 0.000 :1()

2 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}

1 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass}

4 0.000 0.000 0.000 0.000 {built-in method builtins.len}

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

2 0.000 0.000 0.000 0.000 {method 'squeeze' of 'numpy.ndarray' objects}

In [6]: %prun numpy.linalg.norm(c1 - c2)

10 function calls in 0.000 seconds

Ordered by: internal time

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 0.000 0.000 {built-in method builtins.exec}

1 0.000 0.000 0.000 0.000 linalg.py:1976(norm)

1 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.dot}

1 0.000 0.000 0.000 0.000 :1()

1 0.000 0.000 0.000 0.000 numeric.py:406(asarray)

1 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}

1 0.000 0.000 0.000 0.000 linalg.py:111(isComplexType)

1 0.000 0.000 0.000 0.000 {built-in method builtins.issubclass}

1 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.array}

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

%prun 的作用是告诉你函数调用需要多长时间才能运行,包括一些跟踪以找出瓶颈所在的位置 . 在这种情况下, scipy.spatial.distance.euclidean 和 numpy.linalg.norm 实现都非常快 . 假设您定义了一个函数 dist(vect1, vect2) ,您可以使用相同的IPython魔术调用进行概要分析 . 作为另一个额外的好处, %prun 也可以在Jupyter笔记本内部工作,你可以做 %%prun 分析整个代码单元,而不仅仅是一个函数,只需将 %%prun 作为该单元格的第一行 .


版权声明:本文为weixin_42373997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。