numpy和scipy计算向量欧氏距离性能对比

本文通过实测对比了使用NumPy和SciPy库计算大规模数据集欧氏距离的效率,结果显示SciPy在计算速度上显著优于NumPy。
# coding:utf-8

from scipy import spatial
from functools import wraps
import datetime
import numpy as np


def print_execution_time(func, iter=100):
    @wraps(func)
    def warpper(*args, **kwargs):
        total_time = 0
        for i in range(iter):
            start_time = datetime.datetime.now()
            res = func(*args, **kwargs)
            end_time = datetime.datetime.now()
            duration_time = (end_time - start_time).microseconds // 1000
            total_time += duration_time
        avg_time = total_time / iter
        print("function name -> %s, elapse time -> %s ms" % (func.__name__, avg_time))
        return res

    return warpper


@print_execution_time
def distance_euclidean_numpy(vec1, vec2):
    return np.sqrt(np.sum(np.power(vec1 - vec2, 2), axis=1))


@print_execution_time
def distance_euclidean_scipy(vec1, vec2, distance="euclidean"):
    return spatial.distance.cdist(vec1, vec2, distance)


x = np.random.rand(1000000).reshape((-1, 2)) * 100
x = x.astype(np.int16)

# print(x.dtype, x.shape)
y = np.array([[1, 2]])

print("starting")

distance_numpy = distance_euclidean_numpy(x, y)
distance_scipy = distance_euclidean_scipy(x, y, "euclidean")
print(distance_numpy[500:510])
print(distance_scipy[500:510])

输出结果:

starting
function name -> distance_euclidean_numpy, elapse time -> 24.62 ms
function name -> distance_euclidean_scipy, elapse time -> 10.21 ms
[ 53.60037313  50.28916384  77.62087348  52.63078947  47.38143096
  75.16648189 113.27841807 101.67103816 118.1058847   65.8559033 ]
[[ 53.60037313]
 [ 50.28916384]
 [ 77.62087348]
 [ 52.63078947]
 [ 47.38143096]
 [ 75.16648189]
 [113.27841807]
 [101.67103816]
 [118.1058847 ]
 [ 65.8559033 ]]


结论:scipy计算性能更高

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值