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_practiceprint(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 = &aprint(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.mzph.cn/pingmian/37648.shtml

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

相关文章

深度解析服务发布策略之A/B测试

A/B测试,作为一种科学决策方法,被广泛应用于产品迭代、营销策略优化、用户体验改进等多个领域,其核心在于通过对比实验,定量分析不同方案的效果差异。这种测试方法通常是将用户随机分配到两个或多个不同的版本中,然后收…

教您设置打开IDM下载浮动条的快捷键 全网最强下载神器idm怎么使用教程 idm浮动条不显示怎么办

很多人都知道Internet Download Manager(以下简称IDM)是一款非常优秀的下载提速软件。它功能强大,几乎能下载网页中的所有数据(包括视频、音频、图片等),且适用于现在市面上几乎所有的浏览器,非常受大家欢迎。 在使用I…

面向对象和面向过程编程的区别

引言 小伙伴们,当你们看到这章的时候,显然你们已经跨过了来自指针给你们带来的麻烦,唔~真棒呢,但是我们只学会一些基础的C语法并不能帮我们解决问题,甚至是稍微难一些的题目我们都没办法解决,那怎么办呢&am…

多机调度问题

#include<iostream> #include<string> using namespace std; struct work {int time;int number; }; int setwork0(int m,int n,int a[],struct work w[]) {int maxtime0;for(int i1; i<m; i){cout<<i<<"号设备处理作业"<<w[i].num…

python系列30:各种爬虫技术总结

1. 使用requests获取网页内容 以巴鲁夫产品为例&#xff0c;可以用get请求获取内容&#xff1a; https://www.balluff.com.cn/zh-cn/products/BES02YF 对应的网页为&#xff1a; 使用简单方法进行解析即可 import requests r BES02YF res requests.get("https://www.…

YOLOv8改进 | 卷积模块 | 分布移位卷积DSConv替换Conv

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效…

spring mvc实现一个自定义Converter转换器

介绍 自定义转换器输入Spring MVC框架范畴&#xff0c;总体上输入Spring生态的一个特性&#xff0c;对Web开发起作用。 使用场景 在Spring Boot应用中&#xff0c;自定义转换器主要用于处理HTTP请求参数到Java对象的自动转换&#xff0c;或者Java对象到HTTP响应的序列化过程…

使用Apache Kafka 构建实时数据处理应用

简介 Apache Kafka的基本概念 Apache Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者和生产者的所有实时消息。以下是一些Apache Kafka的核心概念: Producer:生产者,消息和数据的发布者。生产者负责将数据发送到Kafka集群。 Consumer:消费者,消息和数…

2024百度之星第一场-110串

补题链接&#xff1a; 码蹄集 三个状态转移的计数dp 先确定状态 n个数至多修改k次&#xff0c;保证不出现字串“110” 常规想法先把状态确定为dp[n][k][0/1]&#xff0c;前n个数&#xff0c;修改k次后&#xff0c;末尾数为0/1&#xff0c;不能转移再换思路。 初始状态设定如…

使用ECharts创建动态数据可视化图表

使用ECharts创建动态数据可视化图表 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Web应用开发中&#xff0c;数据可视化是至关重要的一环。ECharts作…

左耳听风_100_99_高效学习如何学习和阅读代码

你好&#xff0c;我是陈浩网名&#xff0c;做我个house.这节课呢我想来谈一谈如何学习和阅读代码。 杰夫阿特伍德啊说过这么一句话&#xff0c;code tell you how comments tell you why.那我把它扩展一下呢&#xff0c;就是代码会告诉你what how和details.而文档和书呢会告诉…

rk3568 rockit编译测试

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 20.04.6 LTS 2.SDK版本 rk3568_linux_5.10 3.单板 迅为itop-3568开发板 一、编译rockit组件包 rockit组件包在4.10版本需要手动编译&#xff0c;奈何我的版本怎么都编译不了&#xff0c;后来改用5.10版本才编译通过。 4.1…

存储请求地址但是使用时请求的是端口

baseURL默认全局加载一次&#xff0c;后续直接读取缓存 解决方案&#xff1a;

类和对象(封装、继承、多态、友元)

c面相对象的三大特性为&#xff1a;封装、继承、多态 c 认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 一、类和对象&#xff08;封装&#xff09; &#xff08;一&#xff09;封装的意义 封装是c面相对象的三大特性之一 封装的意义&#xff1a; 将属性和行为…

实现List接口的ArrayList和LinkedList

package study;import java.util.*;public class day01_list {public static void main(String[] args) {// <Integer> 这个尖括号表示的是 Java 的泛型&#xff08;Generics&#xff09;// 泛型是 Java 5 引入的一项特性&#xff0c;它允许你在 类、接口和方法 中使用类…

网页如何快速被收录?

其实就是要要吸引搜索引擎爬虫更快地抓取你的网页&#xff0c;想让爬虫爬取网页&#xff0c;首要做的自然是创建并提交站点地图。站点地图是搜索引擎了解你网站结构的重要工具。它可以帮助爬虫更快地发现和抓取你网站上的所有重要页面。通过Google Search Console提交站点地图&…

网络编程常识

网络编程常识 网络编程常识一、 OSI七层模型对应 TCP/IP四层模型二、TCP协议 最后 网络编程常识 一、 OSI七层模型对应 TCP/IP四层模型 OSI七层模型TCP/IP四层模型应用层表示层会话层应用层传输层传输层网络层网络层数据链路层物理层网络接口层 物理层&#xff1a;主要定义物…

深度学习在目标检测中的革命性应用与进展

目标检测是计算机视觉领域的核心任务之一&#xff0c;它旨在从图像或视频中识别和定位感兴趣的目标。深度学习的出现极大地推动了目标检测技术的发展&#xff0c;提高了检测的准确性和效率。本文将详细探讨深度学习在目标检测中的应用&#xff0c;包括关键技术、算法进展、实际…

python编程题3

1. 将一个文件中的所有英文字母转换成大写&#xff0c;复制到另一文件中。 fiopen("ex01.py",r) foopen("f2.txt",w) for line in fi:lineline.upper()fo.write(line) fi.close() fo.close() 2. 将一个文件中的指定单词删除后&#xff0c;复制到另一个文…

mysql lpad函数和rpad函数的用法

1、lpad函数 -从左至右填充 lpad( string, padded_length, [ pad_string ] ) string 准备被填充的字符串&#xff1b; padded_length 填充之后的字符串长度&#xff0c;也就是该函数返回的字符串长度&#xff0c;如果这个数量比原字符串的长度要短&#xff0c;lpad函数将会把字…