开源贡献代码之​探索一下Cython

探索一下Cython

本篇文章将会围绕最近给Apache提的一个feature为背景,展开讲讲Cython遇到的问题,以及尝试自己从0写一个库出来,代码也已经放星球了,感兴趣的同学可以去下载学习。

0.背景

最近在给apache arrow提的一个feature因为C++接口的变动引发其他语言的接口变动,一些测试也跟着需要修复。

像PyArrow熟悉的人应该一点也不陌生,这次接口变动也需要修改这个库,因为是在一个仓库里的,不然ci过不了。而PyArrow的实现是通过Cython实现的,之前也没特别学习Cython,改出了一堆问题,其中遇到两个问题比较重要,这里记录一下。

问题1:初始化函数里面不支持其他类的默认构造。

示例:

def __init__(self, mode="only_valid", filter=Expression._scalar(True)):pass

报错:

TypeError: descriptor '_scalar' for 'pyarrow._compute.Expression' objects doesn't apply to a 'bool' object

可以看到没识别出来,实际情况是Expression._scalar(True)合法的,我们看里面的实现:

@staticmethod
def _scalar(value):cdef:Scalar scalarif isinstance(value, Scalar):scalar = valueelse:scalar = lib.scalar(value)return Expression.wrap(CMakeScalarExpression(scalar.unwrap()))

可以看到,里面支持正常的bool类型,我怀疑这是cython的限制,于是改为下面这种方式就可以了:

def __init__(self, mode="only_valid", filter=None):if filter is None:filter = Expression._scalar(True)

问题2:定义顺序

当我使用后面创建的_true,每次传递进去的默认值是空,这个比较好理解,因为最后编译好了会翻译为一个xxx.cpp文件,根据C++规则前面读到的自然就是空了。

def __init__(self, mode="only_valid", filter=_true):passcdef CExpression _true = CMakeScalarExpression(<shared_ptr[CScalar]> make_shared[CBooleanScalar](True)
)

好了,基于以上背景,我自己也想写一个例子出来,例如:使用C++写一个类,封装sort和sum,然后使用Python调用。

1.Cython完整例子

  1. 创建一个.h文件

void sort(std::vector<int>& nums) {std::sort(nums.begin(), nums.end());
}
int sum(std::vector<int>& nums) {int sum = 0;for (int num : nums) {sum += num;}return sum;
}
  1. 创建foo.pyx

重要点:上面vector需要:

from libcpp.vector cimport vector

然后去定义一个class,调用C++的接口。

cdef class PyFoo:cdef Foo* fdef __cinit__(self):self.f = new Foo()def __dealloc__(self):del self.fdef sort(self, nums):cdef vector[int] c_nums = numsself.f.sort(c_nums)def sum(self, nums):cdef vector[int] c_nums = numsreturn self.f.sum(c_nums)
  1. 创建setup.py文件

ext = Extension('Foo', sources=["foo.pyx"], language="c++", include_dirs=[numpy.get_include()])setup(name="Foo", ext_modules = cythonize([ext]))
  1. 运行

python3 setup.py build_ext --inplace

最后,可以写一个测试脚本去使用自己写的python接口。

import Foof = Foo.PyFoo()
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
f.sort(nums)
print("Sorted nums:", nums)
print("Sum of nums:", f.sum(nums))

Cython在一些项目中使用挺多的,学习起来吧~

运行:

➜  cpython_examples python3 test.py 
Sorted nums: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
Sum of nums: 44

热度更新,手把手实现工业级线程池

0d45e01959e844c0c3aa2b05b4088c1c.jpeg

0ebf387ac57c55280c906b6c7ce615ea.jpeg

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

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

相关文章

医院内可以导航吗?院内导航基于什么技术?

医院将就诊区域平面图、科室分布图&#xff0c;进行整合和数字化&#xff0c;最终形成一张与医院实际布局一致的电子地图&#xff0c;呈现在患者的手机上。基于这张电子地图&#xff0c;患者可以快速对自己的位置有一个清晰的认知&#xff0c;通过楼层切换、地图缩放&#xff0…

remote: HTTP Basic: Access deniedfatal: Authentication failed for

$ git push -u origin main remote: HTTP Basic: Access denied fatal: Authentication failed for https://gitcode.com/edenl/GD32E350_hid_keyboard.git/ 使用访问令牌做为密码登录即可。

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

目标检测算法使用体验是怎么样的?

一、YOLO的初次使用体验 1、基本概念 YOLO&#xff0c;全称为You Only Look Once&#xff0c;是一种实时目标检测算法。 YOLO的核心思想是将目标检测任务当作回归问题来解决&#xff0c;它可以在单次图像遍历中识别出图中的物体的类别和位置&#xff0c;因此得名“You Only …

DRF JWT认证基础

JWT认证 【1】base64使用 &#xff08;1&#xff09;使用场景 电子邮件附件&#xff1a;由于电子邮件协议只支持 ASCII 字符集&#xff0c;因此&#xff0c;如果要发送非 ASCII 数据&#xff08;如图片、音频、视频等&#xff09;&#xff0c;需要先将这些数据进行 base64 编…

Spring5深入浅出篇:JDK代理与CGLIB代理区别

Spring5深入浅出篇:JDK代理与CGLIB代理区别 很多粉丝私信我这个Spring5的课程在哪看,这边是在B站免费观看欢迎大家投币支持一下. https://www.bilibili.com/video/BV1hK411Y7zf JDK动态代理与CGLIB的区别 在Java的世界里&#xff0c;动态代理主要有两种实现方式&#xff1a;JDK…

【Python】基础知识(函数与数据容器)

笔者在C语言基础上学习python自用笔记 type() 返回数据类型 name "root" hei 1.8 wei 77 type_hei type(hei) type_wei type(wei) print(type(name)) print(type_hei) print(type_wei)在python中变量是没有类型的&#xff0c;它存储的数据是有类型的。 数据类…

Linux——界面和用户

本篇文章所写的都是基于centos 7 64位&#xff08;通过虚拟机运行&#xff09;。 一、Linux的界面 Linux操作系统提供了多种用户界面&#xff0c;主要分为图形用户界面&#xff08;GUI&#xff09;和命令行界面&#xff08;CLI&#xff09;。 1、图形用户界面(GUI)&#xff…

【大数据】LSM树,专为海量数据读写而生的数据结构

目录 1.什么是LSM树&#xff1f; 2.LSM树的落地实现 1.什么是LSM树&#xff1f; LSM树&#xff08;Log-Structured Merge Tree&#xff09;是一种专门针对大量写操作做了优化的数据存储结构&#xff0c;尤其适用于现代大规模数据处理系统&#xff0c;如NoSQL数据库&#xff…

Rsync数据同步实战:命令操作指南与最佳实践

&#x1f6a9;本文介绍 ​ 在本文中&#xff0c;我们不仅会介绍Rsync的基本概念和特点&#xff0c;还会详细解析Rsync命令的各个参数和选项&#xff0c;让读者能够灵活运用这些命令完成各种数据同步任务。无论您是数据管理员、系统工程师还是IT爱好者&#xff0c;只要您对Rsyn…

可解释的图像分类,提高组织表征的可信度论文速读

Explainable Image Classification with Improved Trustworthiness for Tissue Characterisation 摘要 机器学习模型进行组织表征可以帮助决策并指导安全的肿瘤切除。为了让外科医生信任该模型&#xff0c;需要提供生成的预测的可解释性。对于图像分类模型&#xff0c;像素归…

sudo的设置

sudo指令就是提高你的用户权限&#xff0c;用来完成root可以完成的工作&#xff0c;但是有一个前提&#xff0c;就是被root添加到信任名单中&#xff0c;接下来我们要讲解如何在root中添加用户到信任名单中。 在root中输入指令&#xff1a; 即可到达添加信用列表的位置&#x…