cython 笔记

数据类型

image

# bool 类型
// bool_type_ptactice.pyx
cdef bint a = 123  # 非0 为 真 , 0 为假
cdef bint b = -123
cdef bint c = 0
py_a = a   # cdef 定义的内容没法直接在python中直接引用
py_b = b
py_c = c

// main.py
import pyximport
pyximport.install(language_level=3)

import bool_type_ptactice
print(bool_type_ptactice.py_a)
print(bool_type_ptactice.py_b)
print(bool_type_ptactice.py_c)

>>>
True
True
False


# int 类型
python3中int是没有范围限制的,cython中会有类型转换如果溢出会报错

# float 类型
python中的对应cython中的double,所以可以放心使用

# bytes 或 str 类型
// bytes_practice.pyx
cdef bytes name_b = b'cython'  # 创建字节使用bytes
cdef str name_s = 'cython'  # 创建字符串使用str 与python一样
cdef unicode name_u = u'cython'  # 与使用str效果等价,使用unicode是前边必须要有u,主要是为了兼容python2
py_name_b = name_b
py_name_s = name_s
py_name_u = name_u

//main.py
import pyximport
pyximport.install(language_level=3)

import bytes_practice

print(bytes_practice.py_name_b)
print(bytes_practice.py_name_s)
print(bytes_practice.py_name_u)

>>>
b'cython'
cython
cython


# 使用python类型进行静态申明
除了C中的数据类型,在cython中还可以使用python中内建的所有数据类型进行静态声明
//py_data_type_practices.pyx
cdef tuple ta =(1, 2)
cdef list la =  [1,2,3]
cdef dict da = {'name': 'cython'}
cdef set sa = {'cython', 'python'}
cdef frozenset fa = frozenset(['1','1', '3', '5'])
py_tuple = ta  # 这里虽然是将cython变量赋值给python变量 但他们其实是同一个变量
py_list = la   # 他们是等价的,所以python变量所支持的操作,在cython中照样支持
py_dict = da  # 比如insert(), append()等
py_set = sa
py_frozenset = fa
print('cython 对象与 python 对象是同一个吗?:', ta is py_tuple)

//main.py
import pyximport
pyximport.install(language_level=3)

import py_data_type_practices
print(py_data_type_practices.py_tuple)
print(py_data_type_practices.py_list)
print(py_data_type_practices.py_dict)
print(py_data_type_practices.py_set)
print(py_data_type_practices.py_frozenset)


>>>
cython 对象与 python 对象是同一个吗?: True
(1, 2)
[1, 2, 3]
{'name': 'cython'}
{'python', 'cython'}
frozenset({'3', '5', '1'})

在cython中使用python内建类型做静态申明的时候,如果没有赋初始值,默认都是None,但是int和float除外(这俩实际上用的是c的类型)。

为什么 Cython 可以做到这一点呢?实际上这些结构在 CPython 中都是已经实现好了的,Cython 将它们设置为指向底层中某个数据结构的 C 指针,比如:cdef tuple a,那么 a 就是一个PyTupleObject *,它们可以像普通变量一样使用,当然 Python 中的变量也是一样的,a = tuple(),那么 a 同样是一个 PyTupleObject *。

python内建类型是没法用来申明指针的哦!!!

指针

与C中的申明方式一样,
cdef int *a = 0
获取指针指向的内存地址不用*,*在python中被占用了(*args, **kwargs, 以及用*拆包)用下表的方式
a[0] = 1

例如:
//pointer_practice.pyx
cdef double a = 3.14
cdef double *b = &a

print(f'a = {a}')

b[0] = 6.66
print(f'update after: a = {a}')


// main.py
import pyximport
pyximport.install(language_level=3)

import pointer_practice

>>>
a = 3.14
update after: a = 6.66


在cython中我们不能在函数中返回一个指针,打印某个指针以及指针作为某个python动态数据结构的成员,
因为在python中没有指针这个概念或者被python隐藏了,只能解释器才能操作指针。

参考文档:https://www.cnblogs.com/traditional/p/13246471.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超详细之IDEA上传项目到Gitee完整步骤

1. 注册gitee 账号密码,gitee官网地址:Gitee官网,注册完成后,登录。 2. 创建仓库,在主页左下角有新建按钮,点击新建后会进入到此页面填写仓库信息。 3. 创建完成后复制仓库地址 4. 打开IntelliJ IDEA新建或…

Python 语法基础一

1.变量 python 中变量很简单,不需要指定数据类型,直接使用等号定义就好。python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前那个变量知道那个变量…

新品Coming Soon!OAK-D-SR-PoE:使用3D+AI视觉结合ToF实现箱体测量和鉴别!

OAKChina 新品:OAK-D SR PoE结合ToF实现箱体检测 3DAI解决方案提供商 手动测量箱体、缺陷、大小等操作可能是一项繁琐并且劳累而机械的任务,但OAK中国本次将提供了更好的解决方案:3DAI视觉处理箱体的识别和检测,使用了即将发布的…

在Ubuntu上安装VNC服务器教程

Ubuntu上安装VNC服务器方法:按照root安装TeactVnc,随后运行vncserver输入密码,安装并打开RickVNC客户端,输入服务器的IP,最后连接输入密码即可。 VNC或虚拟网络计算,可让您连接到远程Linux / Unix服务器的…

力扣 刷题 使用双指针进行数组去重分析

目录 双指针 一、26.删除有序数组中的重复项 题目 题解 二、80. 删除有序数组中的重复项 II 题目 题解 三、27. 移除元素 题目 题解 双指针 我们这里所说的双指针实际上并不是真正的指针,它只是两个变量,用于标识数组的索引等,因其…

基于AiService实现智能文章小助手

顾名思义,这个应用就是希望能利用大模型的能力来帮助我写文章,那这样一个应用该如何利用LangChain4j来实现呢?接下来我们来利用AiService进行实现。 AiService代理 首先,我们定义一个接口Writer,表示作家&#xff1a…

高质量AIGC/ChatGPT/大模型资料分享

2023年要说科技圈什么最火爆,一定是ChatGPT、AIGC(人工智能生成内容)和大型语言模型。这些技术前沿如同科技世界的新潮流,巨浪拍岸,引发各界关注。ChatGPT的互动性和逼真度让人们瞠目,它能与用户展开流畅对…

谷歌如何进行失效链接建设?

失效链接建设是一种高效的外链建设策略,通过发现并利用失效链接来提升自己网站的SEO。以下是详细的步骤: 寻找失效页面:你需要使用SEO工具,如Ahrefs,来查找与你的网站内容相关的失效页面。这些页面可能是竞争对手的失…

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化,并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一:删除viser-vue viser-vue底层依赖antv/g2等库一并被删除,…

【EI会议】2024年机械、计算机工程与材料国际会议 (MCEM 2024)

2024年机械、计算机工程与材料国际会议 (MCEM 2024) 2024 International Conference on Mechanical, Computer Engineering and Materials 【重要信息】 大会地点:广州 官网地址:http://www.ismcem.com 投稿邮箱:ismcemsub-conf.com 【注意…

《XR应用开发者头显运行需求调研报告》重磅发布 ,开发者更加关注集成和可扩展性!

近期,LarkXR发布了一项新的解决方案,实现了3D/XR企业级应用全面接入Apple Vision Pro等头显设备。作为长期陪伴在XR行业开发者身边的技术伙伴,Paraverse平行云发起了此次行业调研,希望通过调研更直观地了解开发者在使用头显运行XR…

IDEA 导出ER图无表关系

一、通过IDEA导出的ER图无表关系,如下: 二、解决无表关系方法 1)这是建表时,user_work表中的t_id不规范,导致idea 找不到虚拟外键,也就不能绘制虚拟外键关系。那我们把user_work表t_id命名规范,t_id是user表…

VBA 批量变换文件名

1. 页面布局 在“main”Sheet中按照下面的格式编辑。 2. 实现代码 Private wsMain As Worksheet Private intIdx As LongPrivate Sub getExcelBookList(strPath As String)Dim fso As ObjectDim objFile As ObjectDim objFolder As ObjectSet fso = CreateObject("Scrip…

Steam新用户怎么参加夏促 Steam最新注册账号+下载客户端教程

steam夏促来了,这里给新玩家科普一下,steam就是一个游戏平台,里面的海量的各种游戏,而steam经常会有各种打折的活动,夏促就是其中之一,并且是其中规模最大的之一,涵盖游戏数量多,优惠…

ZW3D二次开发_CAM_添加刀具

在ZW3D2025中可以通过库添加刀具,代码如下: int idx_tool;int ret ZwCamToolInsertFromLibrary("", "001 METRIC TOOLS.xlsx", "10 mm Flat Endmill", &idx_tool); 平台功能添加刀具如下:

【Linux】进程间通信_2

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 1. 进程间通信分类 管道 管道的四种情况: ①管道内部没有数据,并且具有写端的进程没有关闭写端,读端就要阻塞等待,知道管道pipe内部有数据。 ②管道内部…

esp8266 GPIO

功能综述 ESP8266 的 16 个通⽤ IO 的管脚位置和名称如下表所示。 管脚功能选择 功能选择寄存器 PERIPHS_IO_MUX_MTDI_U(不同的 GPIO,该寄存器不同) PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PERIPHS_IO_MUX_为前缀。后面的…

uniapp开发企业微信内部应用

最近一直忙着开发项目,终于1.0版本开发完成,抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品,公司扩展业务,需要在企业微信中开发内部应用。因为工作中使用的是钉钉,很少使用企业微信,对于…

C# 警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset”

警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset” C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\amd64\Microsoft.CSharp.CurrentVersion.targets(129,9): warning MSB3884: 无法找到规则集文件“MinimumRe…

Android Lint

文章目录 Android Lint概述工作流程Lint 问题种类Lint 警告严重性 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题&am…