有一种观点认为,numpy的功能不能在cython或numba的帮助下加速。但这并不完全正确:numpy的目标是为各种场景提供出色的性能,但这也意味着在特殊场景下的性能并不完美。在

有了特定的场景,您就有机会改进numpy的性能,即使这意味着要重写numpy的一些功能。例如,在本例中,我们可以使用cython将函数加速到因子4,使用numba可以将因子8加速。在

让我们从您的版本开始作为基线(请参阅答案末尾的列表):>>>%timeit cosine(x,y) # scipy's

31.9 µs ± 1.81 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>>%timeit np_cosine(x,y) # your numpy-version

4.05 µs ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit np_cosine_fhtmitchell(x,y) # @FHTmitchell's version

4 µs ± 53.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

>>>%timeit np_cy_cosine(x,y)

2.56 µs ± 123 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

所以我看不到@FHTmitchell版本的改进,但其他方面与您的时间安排没有什么不同。在

向量只有50个元素,所以实际计算需要大约200-300ns:其他的都是调用函数的开销。降低开销的一种可能性是在cython的帮助下每只手“内联”这些函数:

^{pr2}$

这导致:>>> %timeit cy_cosine(x,y)

921 ns ± 19.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

不错!我们可以通过进行以下更改来放弃一些安全性(运行时检查+ieee-754标准)来尝试挤出更多的性能:%%cython -c=-ffast-math

...

cimport cython

@cython.boundscheck(False)

@cython.wraparound(False)

def cy_cosine_perf(np.ndarray[np.float64_t] x, np.ndarray[np.float64_t] y):

...

这导致:>>> %timeit cy_cosine_perf(x,y)

828 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

也就是说,再增加10%,这意味着比numpy版本快5倍。在

还有另一个提供类似功能/性能的工具-numba:import numba as nb

import numpy as np

@nb.jit(nopython=True, fastmath=True)

def nb_cosine(x, y):

xx,yy,xy=0.0,0.0,0.0

for i in range(len(x)):

xx+=x[i]*x[i]

yy+=y[i]*y[i]

xy+=x[i]*y[i]

return 1.0-xy/np.sqrt(xx*yy)

这导致:>>> %timeit nb_cosine(x,y)

495 ns ± 5.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

一个提速8比原来的纽比版本。在

numba速度更快的原因有很多:Cython在运行时处理数据的步幅,prevents some optimization(例如矢量化)。麻木似乎处理得更好。在

但这里的差异完全是由于numba的开销较少:%%cython -c=-ffast-math

import numpy as np

cimport numpy as np

def cy_empty(np.ndarray[np.float64_t] x, np.ndarray[np.float64_t] y):

return x[0]*y[0]

import numba as nb

import numpy as np

@nb.jit(nopython=True, fastmath=True)

def nb_empty(x, y):

return x[0]*y[0]

%timeit cy_empty(x,y)

753 ns ± 6.81 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit nb_empty(x,y)

456 ns ± 2.47 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

对numba来说,几乎减少了2倍的开销!在

正如@max9111所指出的,numpy内联了其他jitted函数,但它也能够以很少的开销调用一些numpy函数,因此以下版本(将inner替换为dot):@nb.jit(nopython=True, fastmath=True)

def np_nb_cosine(x,y):

return 1 - np.dot(x,y)/sqrt(np.dot(x,x)*np.dot(y,y))

>>> %timeit np_nb_cosine(x,y)

605 ns ± 5.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

只慢了大约10%。在

请注意,上述比较仅适用于含有50个元素的向量。对于更多的元素,情况就完全不同了:numpy版本使用了并行化的mkl(或类似的)dot产品实现,并将轻松击败我们简单的尝试。在

这就引出了一个问题:针对特定大小的输入优化代码真的值得吗?有时答案是“是”,有时答案是“否”。在

如果可能的话,我会得到numba+dot的解决方案,对于小输入非常快,但是对于较大的输入,它也具有mkl实现的全部功能。在

还有一点区别:第一个版本返回np.float64-对象,cython和numba版本返回Python float。在

列表:from scipy.spatial.distance import cosine

import numpy as np

x=np.arange(50, dtype=np.float64)

y=np.arange(50,100, dtype=np.float64)

def np_cosine(x,y):

return 1 - inner(x,y)/sqrt(np.dot(x,x)*dot(y,y))

from numpy import inner, sqrt, dot

def np_cosine_fhtmitchell(x,y):

return 1 - inner(x,y)/sqrt(np.dot(x,x)*dot(y,y))

%%cython

from libc.math cimport sqrt

import numpy as np

def np_cy_cosine(x,y):

return 1 - np.inner(x,y)/sqrt(np.dot(x,x)*np.dot(y,y))

python 余弦_Python快速余弦距离相关推荐

  1. 机器人python编程_python快速的制作一个机器人聊天示例

    1 首先我们打开我们的python编辑器,这里我们用到的是pycharm,我们点击右键,选择新建选项.在我们的项目文件中创建一个新项目. 2 在新创建的项目文件中,打开python编程界面,输入图中所 ...

  2. python 注释一段话_Python快速入门(一)

    引言 Python作为一个,目前最火的编程语言之一,已经渗透到了各行各业.它易学好懂,拥有着丰富的库,功能齐全.人生苦短,就用Python. 这个快速入门系列分为六篇,包含了Python大部分基础知识 ...

  3. python r转义_Python快速入门系列之二:还学不会我直播跪搓衣板

    Python作为一个,目前最火的编程语言之一,已经渗透到了各行各业.它易学好懂,拥有着丰富的库,功能齐全.人生苦短,就用Python. 这个快速入门系列分为六篇,包含了Python大部分基础知识,每篇 ...

  4. python requests下载图片_python读取图片大小Python Requests模块快速入门

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似.它比 urllib 更加方便,可以节约我们大量的工作,它比 urllib 更加 Pythoner. 安装 Re ...

  5. 快速计算距离Annoy算法原理及Python使用

    快速计算距离Annoy算法 基本原理 高维稀疏数据进行快速相似查找,可以采用learning to hash参考:Minhashing & LSH & Simhash 技术汇总,但高维 ...

  6. 新书推荐 |《机器学习即服务:将Python机器学习创意快速转变为云端Web应用程序》...

    新书推荐 <机器学习即服务:将Python机器学习创意快速转变为云端Web应用程序> 点击上图了解及购买 谷歌云和Salesforce首选合作伙伴SpringML数据科学副总裁领衔撰写,讲 ...

  7. 【Python数据科学快速入门系列 | 06】Matplotlib数据可视化基础入门(一)

    这是机器未来的第52篇文章 原文首发地址:https://robotsfutures.blog.csdn.net/article/details/126899226 <Python数据科学快速入 ...

  8. c语言转换为python语言_python和c语言

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! c语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快,不能跨平台, ...

  9. Python深度学习-快速指南

    Python深度学习-快速指南 (Python Deep Learning - Quick Guide) Python深度学习-简介 (Python Deep Learning - Introduct ...

最新文章

  1. miniz库简介及使用
  2. java字母反过来_java之字母反转~~ - Plight - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  3. Linux虚拟机设备无法连接到它的理想主机控制器
  4. java流与文件——流
  5. CXF之jaxws:endpoint对spring bean的引用
  6. mysql5.7.22并行回放_技术分享 | 从库 MTS 多线程并行回放(二)
  7. IDEA——使用JSONObject时报错怎么办?
  8. python 字典 列表 元祖_Python基础之列表、元祖、字典、集合,你都知道吗?附视频...
  9. unity mysql 中文乱码_解决Unity3D中文乱码问题
  10. VS2012 注册密钥
  11. 计算机445端口怎么打开,445端口,详细教您445端口怎么关闭
  12. 2022年ASO与分发优化方法汇总
  13. 报错:信息:INFO: Error parsing HTTP request header
  14. java虚拟机-d参数配置_Java虚拟机-JVM各种参数配置大全详细
  15. 天肌处理器天梯排行榜2022 天肌处理器发布时间排行
  16. android 源码导入android studio中(仿佛打开了新世界)
  17. Frequency Estimation
  18. grep_sed_awl_vim
  19. Qt编写物联网管理平台17-记录清理
  20. Excel学习——制作周报

热门文章

  1. Google Chrome插件导出与安装
  2. Python使用matplotlib可视化Treemap图、treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比(Treemap)
  3. Python在Seaborn中手动指定调色板颜色进行数据可视化颜色自定义实战(Manually Specify Palette Colors in Seaborn)
  4. python使用numpy的np.fmod函数计算numpy数组除以某一特定数值剩余的余数(remainder)、np.mod函数和np.fmod函数对负值的处理方式有差异
  5. R语言ggplot2可视化自定义图例(legend)方框(box):所有图例没有方框、每个图例分别在不同的方框中、多个图例放置在同一个方框中
  6. R语言ggplot2可视化将颜色图例和形状的图例组合成综合图例实战
  7. R语言可视化散点图(scatter plot)图中的标签和数据点互相堆叠丑死了,ggrepel包来帮忙:文本标签(label)相互排斥,远离数据点,远离绘图区域的边缘。
  8. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组缺口箱图(notch boxplot)实战
  9. python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题
  10. 多层感知机MLP常见的超参数有哪些?如果MLP模型对于数据集过拟合了,如何调整这些超参数来进行解决?