首页
学习
活动
专区
圈层
工具
发布

HPy - 为 Python 扩展提供更优秀的 C API

官方的 Python/C API 是针对 CPython 的实现的:公开了许多内部细节,使得 API 实现难度较大;而且,如果要为 PyPy、GraalPython、Jython、IronPython...HPy 介绍 HPy 提供了一个新的 API,以用 C 扩展 Python,有零开销、更快速、方便调试、通用的二进制文件(不用任何修改,可在 CPython、PyPy、GraalPython 等解释器上直接加载...在 PyPy、GraalPython(目前比较热火的 Python3 实现,性能提升极大,但对 C 扩展) 等 CPython 替代实现上,运行更快。...更好的 API:标准的 Python/C API 具有其产生时代的特性限制,而 HPy 的设计可以克服一些限制。让扩展 API 更加一致,更易写易读,并且可使 bug 更易于暴露。...首先,我们用标准 Python/C 扩展方式实现 命名文件为 hello_old.c: #include Python.h> static PyObject* add(PyObject* self,

99610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python: C扩展初体验

    哪怕工作中比较少机会自己写C扩展, 了解这块的知识,也有利于我们更加深入了解 Python 的运行本质。...网上比较是通过 ctypes 或者 setup.py 的方式实现引用和编译安装,这边想试下最原始的方法~ 快速开车 1. 实现接口函数 接口函数是什么意思?...同样的,如果我们想要找一个模块的 Python 函数 对应什么的 C模块方法,也能通过这地方比较粗暴得知,例如 Python 的 list # 取自 Python2.7 object/listobject.c...所以,在我们编写 C扩展 时,也需要时刻谨记这步. 主要会用到下面两个宏: 1. 增加引用: Py_INCREF 例: Py_INCREF(pObj1) 2....编译导出 gcc -I /usr/include/python2.7/ -fpic --shared -o test.so test.c 完整例子 test.c #includePython.h>

    1.4K21

    使用 C 或 C++ 扩展 Python

    以下两件不能用 Python 直接做的事,可以通过 extension modules 来实现:实现新的内置对象类型;调用 C 的库函数和系统调用。...为了支持扩展,Python API(应用程序编程接口)定义了一系列函数、宏和变量,可以访问 Python 运行时系统的大部分内容。...Python 的 API 可以通过在一个 C 源文件中引用 "Python.h" 头文件来使用。 扩展模块的编写方式取决与你的目的以及系统设置;下面章节会详细介绍。...注解:C扩展接口特指CPython,扩展模块无法在其他Python实现上工作。在大多数情况下,应该避免写C扩展,来保持可移植性。...Python API 中的函数 PyArg_ParseTuple() 会检查参数类型并将其转换为 C 值。它使用模板字符串确定需要的参数类型以及存储被转换的值的 C 变量类型。细节将稍后说明。

    1.6K22

    Python调用C函数的方法以及如何编写Python的C扩展

    标题比较长,其实“如何用Python调用C的函数”以及“如何编写Python的C扩展”在广义上是同一件事,因为都是用C写底层实现,用Python作接口。...前段时间笔者用SWIG编译某小段函数一直出BUG,检查了两天才发现原来是因为MinGW 32-bit和Python 64-bit不兼容,加之后续笔者还需要用到NumPy C-API,所以现在笔者已弃坑SWIG...,转用以下方法: 按照Python C-API的编程规范,用C编写底层实现函数。...02 正文 编写C代码 假设要实现一个数学计算模块mymath,包含一个整数加法的函数add,那么首先要编写以下代码: #include "D:\Anaconda2\include\Python.h"...调用效果 03 参考资料 [1] Python/C API Reference Manual, https://docs.python.org/2/c-api/ [2] 《Python基础教程》(第2版

    2.5K60

    如何实现可扩展的架构?

    作者 | Miloslav Voloskov 译者 | 平川 策划 | 万佳 本文为实现可扩展架构提出了几个原则:使用合适的工具。不要把写入优先和读取优先数据库弄混了。什么东西都配置多份。...要实现多份配置,就必须让它们保持无状态。不要让后端完成数据库的工作,那样总是更慢。 可扩展性被认为是一个很难解决的问题。...但是,如果想知道其中的原理,你就应该知道如何在裸金属上实现可扩展的设置。 1基本原则  选择恰当的工具 不同的编程语言适用于不同的任务。...例如,Python 有非常丰富的语法糖,非常适合处理数据,而且代码简短而富有表现力。但为了实现这一点,它需要运行在解释器上,在默认情况下,这比编译后在裸金属上运行的 Go 或 C 是要慢的。...通过主从复制,你可以将 DB 加倍并实现负载均衡,但容量不会无限增长。  可能存在的瓶颈 单线程、有状态、不可扩展的服务器。为了实现负载均衡及运行多台服务器,代码必须是无状态的。

    1.5K10

    Airbnb 如何实现 Kubernetes 集群动态扩展

    在这篇文章中,我们将讨论如何使用 Kubernetes Cluster Autoscaler 动态调整集群大小,并重点介绍我们为 sig-autoscaling 社区 贡献的特性。...图 3:异构 Kubernetes 集群 随着我们对集群进行扩展和整合(实现异构集群,每个集群有多个实例类型),我们开始在扩展过程中实现特定的业务逻辑,并发现有必要对自动扩展行为做一些修改。...它使我们能够动态选择何时扩展某些节点组,以满足 Airbnb 的业务需求,实现了我们开发可扩展的自定义扩展器的最初目标。...实现这一修改后,用户可以更快地实现准确扩展。以前,使用优先级的用户必须在每次尝试启动 ASG 之后等待 15 分钟,再尝试低优先级的 ASG。...软件架构如何“以不变应万变” 风口浪尖的 Web 3.0,接下来的路该怎么走?

    1.1K20

    C++使用ffpython嵌入和扩展python

    通常情况下使用C++封装机制,而用python脚本实现策略或者是控制。使用python和C++结合的技术拥有如下优势: l  主体系统使用C++实现,保持系统的高效。...C++与python的编程范式有很大不同,当使用python C API调用python时,python中的一些特有机制会给C++开发者带来很多困惑。...常常使用python C API时需要注意如下几点: l  Python 使用引用计数管理内存,调用python C API时对于返回值返回的是借用的引用还是新的引用,需要根据文档仔细确认。...l  Ffpython使用c++模板技术,封装了python C API的使用细节,保持精巧和简洁,效率和完全的python C API编写的代码几乎相同。...Ffpython的实现可以作为非常好的python C API的示例。 l  Github项目地址:https://github.com/fanchy/ffpython

    1.6K40

    工具丨用C语言扩展Python的功能

    与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C+...最常见的情况是目前已经存在一个用C编写的库,需要在Python语言中使用该库的某些功能,此时就可以借助Python提供的扩展功能来实现。...此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C++实现,从而提供程序的执行性能...本文主要介绍Python提供的C语言扩展接口,以及如何使用这些接口和C/C++语言来对Python进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。...二、Python的C语言接口 Python是用C语言实现的一种脚本语言,本身具有优良的开放性和可扩展性,并提供了方便灵活的应用程序接口(API),从而使得C/C++程序员能够在各个级别上对Python解释器的功能进行扩展

    3.4K90

    扩展欧几里得算法公式推导与Python实现

    本文通过深入浅出的方式,详细推导扩展欧几里得算法的公式,从欧几里得算法开始,一步步揭示其背后的数学原理,并最终实现计算GCD及其贝祖系数的Python代码。...无论你是否具备高等数学背景,这篇文章将带你探索如何巧妙地利用扩展欧几里得算法解决实际问题,让你在数学的世界中发现更多的趣味和应用。...扩展欧几里得算法公式推导与Python实现 的算法,使得满足贝祖等式(Bézout's identity): ax + by = \text{GCD}(a, b) 一、什么是GCD?...实现 以下是使用Python实现扩展欧几里得算法的详细代码: def extended_gcd(a, b): if b == 0: return a, 1, 0 else...通过上述推导和实现,我们可以有效地求解两个整数的最大公约数及其贝祖系数。

    74610

    Ceph如何实现文件系统的横向扩展

    优点: 全局统一命名空间下面对应目录到不同的存储池当中,在进行扩容的时候,不会影响原有的数据,基本是没有迁移数据 方案三: 物理分存储池的结构并没有解决元数据压力过大的问题,而元数据的处理能力并非横向扩展的...,而文件数量和集群规模都是在横向增长,所以必然是一个瓶颈点 这个方案其实很简单,相当于方案二的扩展,我们在方案二中进行了物理存储池的分离,然后把空间映射到子目录,来实现数据的分离,既然规模能够大到分物理空间...,那么我们可以考虑部署多套集群,并且来真正的实现了数据处理能力的横向扩展,因为MDS,可以是多个的了,那么比较重要的问题就是统一命名空间的问题了,怎么实现,这个也简单,主要是跟客户沟通好,让客户接受提出的方案...我们在一些商业系统上面可以看到一些限制,比如单卷的大小最大支持多大,在这里我们需要跟客户沟通好,无限的扩展,会带来一些压力的风险,有方案能够解决这种问题,而这种数据量在之前是没有太多的案例可借鉴的,所以需要人为控制一个目录的最大空间...,技术难度小,难点在于跟客户沟通好数据的层级结构,如果客户能够自己随意增加目录,那么更好实现了,随意的将目录分配到两个集群即可,最终能达到满意的效果就行 当然主要还是需要客户能够接受你的方案,海量小文件的情况下

    54630
    领券