traj_dist 笔记:Cython部分(cydist)

news2024/12/23 0:42:44

1 basic_euclidean.pyx

1.1 cimport 部分

from libc.math cimport sqrt
from libc.math cimport fmin
#使用 cimport 从 C 的标准库 libc 中导入数学函数 sqrt(平方根)和 fmin(两个浮点数的最小值)

cimport numpy as np
'''
导入 NumPy 的 Cython 接口
允许 Cython 代码以高效的方式直接访问 NumPy 数组的底层 C 数据结构。
这对于提高数组操作的性能非常重要。
'''
import numpy as np
'''
导入标准的 Python NumPy 模块。
这允许在 Cython 代码中使用所有标准的 NumPy 函数和功能,就像在普通的 Python 代码中一样
'''


from cpython cimport bool
'''
使用 cimport 从 Cython 的 cpython 模块中导入 C 的布尔类型

允许 Cython 代码使用 C 语言的布尔类型,而不是 Python 的布尔类型。

C 语言的布尔类型在某些情况下比 Python 的布尔类型更高效,尤其是在需要与其他 C 语言代码或库交互时。
'''

1.1.1  之后出现np的时候,应该是Cython接口还是Python Numpy 模块呢?

  • 在实际编码过程中,Cython 会根据上下文判断 np 的具体指代。
    • 如果你在代码中同时使用了两种导入方式,通常 Cython 会优先使用 Cython 接口的 NumPy,因为它提供了对底层 C 数据的直接访问,从而可以优化性能。
    • 但是,如果使用了 NumPy 的某些高级特性或函数,这些是只在 Python 层面提供的,Cython 将使用标准的 Python NumPy 模块。
  • 因此,当代码中有两个不同类型的 np 导入时,Cython 会根据具体的使用情况智能地选择适当的版本。

1.2 eucl_dist 计算两个点之间的欧氏距离

 还有一个用def定义的python版本的函数(内容一样)

1.2.1 为什么要创建一个python版本的函数,一个Cython版本的函数?

创建两个版本的函数,一个使用 cdef 定义( _eucl_dist),另一个使用 def 定义( c_eucl_dist),通常是出于以下几个原因:

  1. 性能与可访问性:

    • cdef 定义的函数(_eucl_dist)是为了性能优化。这些函数在 Cython 模块内部以 C 的速度运行,但它们不能直接从 Python 代码中调用。这意味着,如果你有一些性能关键的内部计算,使用 cdef 函数是理想的选择。
    • def 定义的函数(c_eucl_dist)可以从 Python 代码调用。这种函数对于提供库的外部接口很有用,使得其他不使用 Cython 的 Python 代码也能访问这些功能。
  2. 代码重用与维护:

    • 通过将核心功能编写在 cdef 函数中,并在 def 函数中调用它(这里是选择了写一遍一模一样的代码),可以在保持性能的同时减少代码重复。这样,无论是从 Cython 还是从 Python 级别调用,都使用相同的底层实现。

    • 这种做法还有助于维护,因为任何逻辑更改只需在一个地方进行,即 cdef 函数。

1.3 c_point_to_seg 计算点到线段的距离

1 sspd.pyx

1.1 import 与 cimport

from libc.math cimport fmin

from .basic_euclidean import c_point_to_trajectory
from .basic_geographical import c_point_to_path


cimport numpy as np
from numpy.math cimport INFINITY

1.1.1 cimport 

  • cimport 是 Cython 特有的语句,主要用于导入 C 语言扩展或其他 Cython 模块中定义的类型、函数和变量
  • 要直接访问 C 语言层面的功能时,需要使用 cimport
  • 利用 Cython 的能力来直接与 C 语言层面的代码或数据结构交互,从而提高了代码的运行效率

  • cimport numpy as np :
    • 使用 cimport 来导入 NumPy 的 Cython 接口
    • numpy 在这里不是标准的 Python NumPy 模块,而是一个特殊的 Cython 定义的接口,允许直接访问 NumPy 数组的底层 C 结构
    • 使用这种方式导入 NumPy 数组可以显著提高性能,因为它允许 Cython 代码以更接近 C 语言的方式操作这些数组,绕过了 Python 层面的开销

  • from numpy.math cimport INFINITY
    • numpy.math 模块中导入 INFINITY 常量
    • 同样,这里的 numpy.math 不是标准 Python 模块,而是 NumPy 的 Cython/C 接口

1.1.2 import

至于为什么前两个是import,我们看一下对应文件声明的部分

  • def vs. cdef:
    • def:在 Cython 中使用 def 定义的函数是 Python 函数。这意味着它们可以像任何普通 Python 函数那样被 Python 代码调用。这些函数遵循 Python 的函数调用约定,可以接受 Python 对象作为参数,并返回 Python 对象。
    • cdef:相比之下,cdef 用于定义 Cython 函数或变量,这些函数或变量只能在 Cython 模块内部使用,不能直接从 Python 代码中调用。cdef 函数遵循 C 语言的调用约定,通常用于提高性能。
  • 由于 c_point_to_trajectory 函数是用 def 而不是 cdef 定义的,它可以从 Python 代码中调用。
    • 因此,即使它是在一个 Cython 模块中定义的,这个模块仍然需要使用标准的 Python import 语句来导入,因为它提供了 Python 接口
  • 但是,尽管 c_point_to_trajectory 是一个 Python 函数,它依然利用了 Cython 的特性来提高性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

张正友相机标定法原理与实现

张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可…

Qt开发 之 记一次安装 Qt5.12.12 安卓环境的失败案例

文章目录 1、安装Qt2、安卓开发的组合套件2.1、CSDN地址2.2、官网地址2.3、发现老方法不适用了 3、尝试用新方法解决3.1、先安装JDK,搞定JDK环境变量3.1.1、安装jdk3.1.2、确定jdk安装路径3.1.3、打开系统环境变量配置3.1.4、配置系统环境变量3.1.5、验证JDK环境变量…

白羽肉鸡养殖市场分析:2023年中国市场处于盈利状态

白羽肉鸡是我国养殖的主要快大型肉鸡品种,由于羽毛为白色,相较于本土黄羽肉鸡的羽毛颜色,基层常称其为白羽肉鸡。 隐性白羽鸡属于快大白羽肉鸡。是从白洛克(或白温多得)中选育而成。原产于法国。隐性白羽鸡在优质鸡配套上的应用对我国优质鸡产…

HCIA-H12-811题目解析(5)

1、【单选题】 以下关于Hybrid端口说法正确的有? 2、【单选题】使用命令"vlan batch 10 20"和"valn batch 10 to 20",分别能创建的vlan数量是?() 3、【单选题】二层ACL的编号范围是?…

女士内衣市场分析:预计2028年将达到643.08亿美元

内衣 (英文名:Underwear),是指贴身穿的衣物。内衣有保暖及污秽的危害作用,有时会被视为性征。女士内衣行业生产的主要原料是各类织布或无纺布,成分有海绵、边、定型纱、骨胶、肩带等,布面料在内衣企业的生产成本中所占比重较大。女…

泰裤辣!!!我又学到了监控服务器的各种方法!

好耶!又能学习到监控服务器的各种方法了。像是利用linux命令去监控的方法就有好几种哦 方法一:动态监控top命令 方法二:内存监控free -m 方法三:磁盘iostat -d 2 3 还有利用jmeter插件去监控服务器哦我们可以使用ServerAgent插件…

20、关联容器、无序容器

20、关联容器、无序容器 关联容器mapmultimapsetmultiset 无序容器哈希unordered_map 关联容器 map // map的使用 #include <iostream> #include <map> #include <stdexcept> using namespace std;class Student{ public:Student(const string& name&qu…

【设计模式--结构型--外观模式】

设计模式--结构型--外观模式 外观模式定义结构案例优缺点使用场景 外观模式 定义 又称门面模式&#xff0c;时一种通过多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部 子…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

手写VUE后台管理系统10 - 封装Axios实现异常统一处理

目录 前后端交互约定安装创建Axios实例拦截器封装请求方法业务异常处理 axios 是一个易用、简洁且高效的http库 axios 中文文档&#xff1a;http://www.axios-js.com/zh-cn/docs/ 前后端交互约定 在本项目中&#xff0c;前后端交互统一使用 application/json;charsetUTF-8 的请…

npm run build时提示vue/types/jsx.d.ts中的错误

解决方法一&#xff1a; 可能是因为vue版本过高引起的 我直接将package.json中vue以及vue-template-compiler的版本的前面^去掉&#xff0c;安装指定的版本 注意&#xff1a;vue和vue-template-compiler需要版本一致 参考链接&#xff1a;链接 解决方法二&#xff1a; 如果如…

JavaScript-Window对象

Window对象 BOM&#xff1a;浏览器对象模型 定时器-延时函数 JavaScript内置的一个用来让代码延迟执行的函数&#xff0c;setTimeout setTimeout(回调函数&#xff0c;等待的毫秒数);setTimeout仅仅只执行依次&#xff0c;所以可以理解为就是把一段代码延迟执行&#xff0c…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后&#xff0c;启动窗口一闪而过&#xff1f…

phpstudy小皮(PHP集成环境)下载及使用

下载 https://www.xp.cn/download.html直接官网下载即可&#xff0c;下载完解压是个.exe程序&#xff0c;直接点击安装就可以&#xff0c;它会自动在D盘目录为D:\phpstudy_pro 使用 phpMyAdmin是集成的数据库可视化&#xff0c;这里需要下载一下&#xff0c;在软件管理-》网站程…

pycharm手动安装包

1.下载对应的包 TTS PyPI 2.手动解压&#xff0c;找到文件放到pycharm对应项目的lib文件夹中 以TTS包为例&#xff0c;找到下载并解压的包中的2个文件&#xff0c;一个名称一个info结尾 3.放到项目的lib文件夹中 eg&#xff1a;路径&#xff1b;C:\doc\myProject\speaker\venv…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

12.11_黑马数据结构与算法笔记Java

目录 070 栈 链表实现 概念理清&#xff1a;什么时候是指针的指向&#xff0c;什么时候是元素本身&#xff1f; 071 栈 数组实现 072 栈 e01 有效的括号 072 栈 e02 后缀表达式求值 072 栈 e03 中缀表达式转后缀1 072 栈 e03 中缀表达式转后缀2 072 栈 e03 中缀表达式转…

大文件传输软件和传统软件的优缺点

在当前信息时代&#xff0c;文件和数据的传输已成为我们工作和生活中不可或缺的一环。无论是向同事发送报告还是与朋友分享电影&#xff0c;我们都需要依赖软件完成这些操作。然而&#xff0c;随着文件和数据容量的增大&#xff0c;传统的文件传输软件如FTP、HTTP、SMB、NFS等已…

操作系统内部机制学习

切换线程时需要保存什么 函数需要保存吗&#xff1f;函数在Flash上&#xff0c;不会被破坏&#xff0c;无需保存。函数执行到了哪里&#xff1f;需要保存吗&#xff1f;需要保存。全局变量需要保存吗&#xff1f;全局变量在内存上&#xff0c;无需保存。局部变量需要保存吗&am…