开源贡献代码之​探索一下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.mzph.cn/news/826208.shtml

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

相关文章

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama&#xff1a;开源小语言模型 【Abstract】 我们推出了 TinyLlama&#xff0c;这是一个紧凑的 1.1B 语言模型&#xff0c;在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2&#xff08;Touvron 等人&#xff0c;2023b&#xff…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

C语言 三目运算符

C语言 逻辑分支语句中 还有一种 三目运算符 我们编写代码如下 #include <stdio.h>int main() {const char* a 1 1 ? "表达式1" : "表达式2";printf("%s", a);return 0; }这里 我们根据逻辑 先定义一个a 然后 它的值 等于一个 三目运算…

【CodeGeeX】国产的免费AI编程助手

CodeGeeX&#xff08;官网&#xff1a;https://codegeex.cn/&#xff09;是一款基于大模型的全能的智能编程助手。它可以实现代码的生成与补全、自动添加注释、代码翻译以及智能问答等功能&#xff0c;能够帮助开发者显著提高工作效率。CodeGeeX支持主流的编程语言&#xff0c;…

Serverless:程序员必须知道的云计算利器

作为一名程序员&#xff0c;你是否厌倦了管理服务器和基础设施的繁琐任务&#xff1f;Serverless 架构横空出世&#xff0c;解放你 khỏi这些负担&#xff0c;让你专注于编写代码。 什么是 Serverless&#xff1f; Serverless 是一种云计算模型&#xff0c;它允许你编写和部署…

C++练级之路——类和对象(下)

目录 1、构造函数初始化列表 2、类型转换 3、explicit关键字 4、static成员 5、友元 友元函数 友元类 6、内部类 7、匿名对象 8、拷贝构造时的一些编译器优化 差不多结束了&#xff0c;类和对象&#xff01; 1、构造函数初始化列表 初始化列表&#xff1a;以一个冒号…

python:元组,字符串,切片

一、元组# 列表可以修改内容&#xff0c;元组可以不被修改 # 在程序内封装数据&#xff0c;不希望数据被篡改&#xff0c;所以使用元组 # 语法&#xff1a; 不限制类型 # 定于元组的字面量&#xff1a; &#xff08;元素&#xff0c;元素&#xff0c;元素.....&#xff09; # 定…

萌新_1 环境安装(基于QQNT框架 Python Flask)

遇到问题加QQ群聊 群主在线解答 点击加入群聊【星辰开发】 一&#xff1a;安装QQ 目前为开发&#xff0c;推荐都安装到一台电脑上 直接安装到本地windows电脑&#xff0c; 优点方便开发 一键安装 Windows 用户一键安装方案 https://github.com/super1207/install_llob/rel…

LLMs——扩展数据受限的语言模型解决方案

概述 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大型语言模型的发展一直是研究的热点。这些模型通过增加参数数量和训练数据量来提升性能&#xff0c;但这种增长趋势是否会有一个极限&#xff1f;实际上&#xff0c;研究者们已经注意到&#xff0c;为了有效地…

go语言触发浏览器打开网址程序实例

在Go语言中&#xff0c;触发浏览器打开特定的网址通常涉及调用操作系统的命令行工具来启动默认的浏览器并导航到指定的URL。 示例&#xff1a; package main import ( "fmt" "os/exec" "runtime" ) func main() { url : "https:/…

大话设计模式-依赖倒转原则

依赖倒转原则 在大话设计模式这本书中&#xff0c;作者通过电话修电脑这个例子引入了面向对象设计的基本原则之一&#xff1a;依赖倒转原则。 概念 依赖倒转原则是面向对象设计的基本原则之一&#xff0c;它用于减少类之间的耦合&#xff0c;提高系统的灵活性和可维护性。在…

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

贴片 AMC1200BDWVR 封装 SOIC-8 隔离放大器IC芯片

AMC1200BDWVR的应用领域相当广泛&#xff0c;主要涵盖以下几个方面&#xff1a; 工业控制&#xff1a;在工业自动化系统中&#xff0c;AMC1200BDWVR可用于精确地检测和控制电流&#xff0c;例如在电机驱动和电力转换系统中。 电源管理&#xff1a;该器件适用于各种电源系统&a…

Okhttp 403 Forbidden

android App 在使用okhttp下载全国中小企业股份转让系统的pdf文件时候,下载完成后使用MuPDF无法解析,提示文件损坏或者不是PDF文件,查看Okhttp的下载请求,发现报403 Forbidden错误: {protocol=http/1.1, code=403, message=Forbidden, url=https://www.neeq.com

16篇 hdfs中篇

36. **更改文件权限** (hdfs fs -chmod): 更改HDFS中文件或目录的权限模式。 - 示例&#xff1a;hdfs fs -chmod 666 hdfs_file&#xff08;设置文件的权限为可读写&#xff09; 37. **更改文件所有者** (hdfs fs -chown): 更改HDFS中文件或目录的所有者和组。 - 示例…

请解释Java中的Hibernate框架

Hibernate是一个开源的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;用于在Java应用程序中将Java类映射到数据库表。它提供了一种将对象数据映射到关系型数据库的方式&#xff0c;允许开发者以面向对象的方式来处理数据库操作&#xff0c;而不是编写复杂的SQL语句。…

【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

在教育、体育、安防、交通、医疗等领域中&#xff0c;实时人体关键点检测应用发挥着至关重要的作用&#xff0c;比如在体育训练时&#xff0c;实时人体关键点检测可以精确、实时地捕捉运动员的动作&#xff0c;从而进行动作分析和优化&#xff1b;在安防应用场景中&#xff0c;…

a new start 口语 4.20

hear customer needs make the pitch picth :v 提方案&#xff0c;推销 pitch my company to you 我提提我公司的方案 your pitch is good. close the deal.达成协议 needs :需求 what can i do for you today? 在销售里面 can i help you find anything? 这看上…