想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍

2023-12-07

这是我的代码

import numpy as np
import time
from scipy.spatial import distance

y1=np.array([0,0,0,0,1,0,0,0,0,0])
y2=np.array([0. , 0.1, 0. , 0. , 0.7, 0.2, 0. , 0. , 0. , 0. ])

start_time = time.time()
for i in range(1000000):
    distance.sqeuclidean(y1,y2)
print("--- %s seconds ---" % (time.time() - start_time))

---15.212640523910522秒---

start_time = time.time()
for i in range(1000000):
    np.sum((y1-y2)**2)
print("--- %s seconds ---" % (time.time() - start_time))

---8.381187438964844--- 秒

我认为 Scipy 已经过优化,所以它应该更快。

任何意见将不胜感激。


这是更全面的比较(归功于@Divakar'sbenchit包裹):

def m1(y1,y2):
  return distance.sqeuclidean(y1,y2)

def m2(y1,y2):
  return np.sum((y1-y2)**2)

in_ = {n:[np.random.rand(n), np.random.rand(n)] for n in [10,100,1000,10000,20000]}

enter image description here

scipy 对于更大的数组会变得更高效。对于较小的数组,调用该函数的开销很可能超过它的好处。根据source, scipy 计算np.dot(y1-y2,y1-y2).

如果您想要更快的解决方案,请使用np.dot直接直接进行,无需额外的行和函数调用的开销:

def m3(y1,y2):
  y_d = y1-y2
  return np.dot(y_d,y_d)

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍 的相关文章

随机推荐

  • 如何使用 selenium webdriver 在 C# 中以私有模式启动 IE

    我开始将 selenium Webdriver 与 c 和 Visualstudio 一起使用 我想以私有模式启动 Internetexplorer 所以我在测试期间不必关心旧的浏览数据 我现在搜索了很长时间才找到如何做到这一点 遗憾的是我
  • Fluent NHibernate 强制外键引用不可为空

    刚刚接触一些 Fluent NHibernate AutoMap 约定 并遇到了一些我无法弄清楚的事情 我想我只是没有找对地方 基本上试图在一对多关系的 多 方面强制执行 NOT NULL 看起来 使用自动映射 它总是使数据库中的父属性 I
  • timezone_name_from_abbr() 无法正确识别

    基本上我的网站是全球性的 我需要能够检测用户的时区并显示准确的时间 我有一个非常简洁的脚本 直到现在它都可以完美地工作 它需要一个时区偏移量 我用 javascript 获取并通过 cookie 传递该时区偏移量 if empty COOK
  • Django 管理后端“操作错误”尝试写入只读数据库

    这个问题似乎已被问过很多次 但我检查过的所有解决方案尚未对我有用 我在跑步nginx在安装了 Django 1 6 1 的 Ubuntu 14 04 服务器上 我正在尝试为项目使用默认的 django 管理后端 通常位于 localhost
  • #1067 - “bonusid”的默认值无效,我该如何修复此错误?

    SQL查询 CREATE TABLE bonus bonusid INT 10 DEFAULT 0 NOT NULL AUTO INCREMENT empid INT 10 DEFAULT 0 NOT NULL datebonus DATE
  • 如何通过参数操作保护 REST API 免受重放攻击?

    我正在开发安全支付 API 我希望通过操纵 url 中的参数来避免重放攻击 例如在以下 API 调用中 一旦执行此 API 调用 具有足够知识的人就可以通过修改这三个参数中的任何一个来执行相同的 API 调用 以满足他 她自己的利益 我曾想
  • jquery - 滑动切换不平滑

    我有一个问题slideToggle函数于jQuery 一点也不顺利 每当我单击 查看更多 按钮时 应该显示的内容slideToggle 只是弹出 没有任何效果 这是 HTML 代码 td class third a href class b
  • C++ -- Detours (Win32 API 劫持) -- 劫持类方法

    我很长一段时间都没有遇到 Detours 劫持功能的问题 当我尝试劫持类方法时 在我的例子中是来自 mshtml dll 的 IHTMLDocument2 write 我遇到了无尽的问题 主要是类型不匹配 由于我在网上没有找到任何相关示例
  • Laravel 5:仅在一个 URL 上路由 CORS 问题

    我正在尝试向外部 laravel 站点发出 2 个 ajax 请求 其中一个请求完美运行 列表 另一个 savedevice 给我以下错误 访问 XMLHttpRequest 位于 http localhost somesite devic
  • 计算时间间隔

    我正在构建一些基于这篇有用的帖子 我对数据集有三个相关问题df machine ISOdatetime 1 M1 2013 08 21 18 16 39 2 M1 2013 08 21 18 20 44 3 M1 2013 08 21 18
  • 将 URL 参数传递到 Web 应用程序脚本中

    这个问题让我想拔掉头发 我正在尝试将 URL 参数传递给 Google Apps 脚本 其中包含我想要呈现的数据的行 ID 来自电子表格 我的参数是story 但是 无论我尝试什么 我都会遇到各种各样的错误 最新的是 类型错误 无法从未定义
  • Angular 2:输入每4位数字后添加连字符,卡号输入

    我需要在输入的每 4 个数字后添加一个连字符 我在控制台中得到这个 我怎样才能实现这个以改变角度 2 的输入 我使用的代码如下 ts mychange val var self this var chIbn self storeData i
  • 安装过程中 Activator.CreateInstance 对象的 InvalidCastException

    我有以下程序 private static IMyInterface OpenInstance string assemblyPath string classType string assemblyName out AppDomain d
  • 如何使用修复,它是如何工作的?

    我对文档有点困惑fix 虽然我想我现在明白它应该做什么 所以我查看了源代码 这让我更加困惑 fix a gt a gt a fix f let x f x in x 这究竟是如何返回一个固定点的 我决定在命令行尝试一下 Prelude Da
  • GDB 符号从哪里来?

    当我加载 Fedora 28 时 usr bin ls文件导入GDB 我可以访问该符号abformat init 即使它不作为字符串存在 也不存在于二进制文件的符号表中 file usr bin ls usr bin ls ELF 64 b
  • 在 Rails 中给出复合主键

    我如何在没有任何 gem 的情况下在 Rails 中给出复合主键 看起来您正在尝试指定之间的多对多关系Users and Projects 在关系本身上有一个附加字段 您当前所做的方式不是 Rails 的做事方式 尤其是复合主键的概念 Ra
  • 我的正则表达式无法正常工作

    我的正则表达式无法正常工作 我正在向你展示before regex text and after regex text 我正在使用这个正则表达式re search r ms Infobox film text 您将看到我的正则表达式在之后不
  • Excel VBA 使用 ADODB 查询 Sharepoint 上的 MS Access 数据库 - “不是有效的文件名”

    有人可能会告诉我为什么在尝试连接到 Sharepoint 上存储的 MS Access 数据库时收到 不是有效的文件名 错误吗 连接到 C 上的文件没有任何问题 Set cnn New ADODB Connection MyConn C s
  • 如果没有结果,MySQL 查询将返回数字“零”

    当选择日期并且该日期在我的表中不存在时 它当前将返回空结果集 我怎样才能为那些空结果集返回数字零 SELECT SUM TOTAL SUM 5STAR STORE DATE FROM table WHERE DATE gt 2012 02
  • 想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍

    这是我的代码 import numpy as np import time from scipy spatial import distance y1 np array 0 0 0 0 1 0 0 0 0 0 y2 np array 0 0