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

探索一下Cython

本篇文章将会围绕最近给Apache提的一个feature为背景,展开讲讲CPython遇到的问题,以及尝试自己从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/635949.html

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

相关文章

zabbix自定义监控、自动发现和注册以及代理设置

前言 监控项的定制和新设备的注册往往需要大量手动操作&#xff0c;这会导致维护成本的增加和监控效率的降低。本文将介绍如何利用 Zabbix 的自定义功能&#xff0c;实现监控项的动态发布和新设备的自动注册以及代理设置、从而简化运维工作并实现更高效的监控管理。 Zabbix 监…

通义千问 Qwen-14B 模型微调实战案例及经验总结

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

网络安全产品---数据库防火墙/审计

数据库防火墙 防火墙的类型繁多&#xff0c;即使下一代防火墙或者说AI防火墙集成功能再多&#xff0c;我觉得waf与数据库防火墙也有其无法被替代的理由&#xff0c;以此记录我对数据库防火墙的理解 what 数据库防火墙是基于数据库协议分析与访问行为控制的数据库安全防护产品…

安居水站:独立审慎的批判思考-审辩式思维

正文共:2492字 15张图 预计阅读时间:5分钟 在设计这个教案时&#xff0c;我们的目标是培养出具有独立思考、逻辑思维和批判性分析能力的学生。这些技能是当今社会日益重视的&#xff0c;也是当前教育体系中学生所普遍缺乏的。为此&#xff0c;我们的教案将通过一系列的活…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中&#xff0c;全文搜索通常通过使用tsvector和tsquery类型&#xff0c;以及to_tsvector和…

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点&#xff1f; ADC&#xff1a; …

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败&#xff0c;报如下错误&#xff1a; Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

vscode设置conda默认python环境,简单有效

本地conda 可能安装了各种环境&#xff0c;默认的vscode总是base环境&#xff0c;这时你想要在vscode调试python代码&#xff0c;使用默认的环境没有安装对应的包就会遇到报错解决这个问题的方法很简单ctrlshiftp 调出命令面板 再输入 select interpreter , 选择 python 选择解…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍&#xff1a; 容器&#xff08;Container&#xff09;格式&#xff1a;一种文件封装格式&#xff0c;里边主要包含了流&#xff0c;一般会使用一个特定的后缀名标识&#xff0c;例如.mov、.avi、.wav等。流 &#xff08;Stream&#xff09;&am…

C语言学习/复习25---函数指针/函数指针数组/函数指针数组指针的判断、快排中的函数指针和回调函数实现任意数据类型比较的案例

一、函数指针数组 1.什么是函数指针数组 2.函数指针数组的定义 案例1&#xff1a;函数指针与函数指针数组 注意事项&#xff1a;( )>[ ]>*,先与[ ] 结合就是数组&#xff0c;先与*结合就是指针 二、指向函数指针数组的指针 注意事项1&#xff1a;( )>[ ]>*,先与[ ]…