如何在 Cython 中传递指向 c 函数的指针?

2024-04-26

我正在尝试打电话qsort在 Cython 中使用自定义比较函数,但我不明白如何传递函数引用。首先,我有一个结构:

cdef struct Pair:
    int i,j
    float h

比较函数排序依据h:

cdef int compare(const_void *a, const_void *b):
    cdef float v = ((<Pair*>a)).h-((<Pair*>b)).h
    if v < 0: return -1
    if v > 0: return 1
    return 0

这是我遇到问题的部分:

    cdef Pair[5] pa
    for i in range(5):
        pa[i].i = i;
        pa[i].j = i*2;
        pa[i].h = i*.5;
    qsort(pa,5,sizeof(Pair),compare)

最后一行不会编译并生成此错误,我认为这与我不知道如何通过这一事实有关compare作为参考qsort:

Cannot assign type 'int (const_void *, const_void *)' to 'int (*)(const_void *, const_void *) nogil'

我无法重现您的错误。您使用的代码是正确的,并且与 Cython 0.15 一起使用。我看到的唯一可能是您的错误的是附加到类型的“gil”。如果您想专门将导入方法声明为“gil safe”,请在声明末尾附加“nogil”。

(请注意,您可以使用 cython -a 检查您的 python 代码,然后打开网络浏览器)



cdef extern from "stdlib.h":
    ctypedef void const_void "const void"
    void qsort(void *base, int nmemb, int size,
            int(*compar)(const_void *, const_void *)) nogil

cdef struct Pair:
    int i,j
    float h

cdef int compare(const_void *a, const_void *b):
    cdef float v = ((a)).h-((b)).h
    print 'do something with', v
    if v  0: return 1
    return 0

def r():
    cdef Pair[5] pa
    for i in range(5):
        pa[i].i = i;
        pa[i].j = i*2;
        pa[i].h = i*.5;
    print 'call qsort'
    qsort(pa,5,sizeof(Pair),compare)
    print 'call qsort done'

r()
  

该片段编译为:



$ cython --version
Cython version 0.15
$ cython --embed test.pyx
$ gcc -I/usr/include/python2.7 -Wall -std=c99 test.c -lpython2.7
$ ./a.out 
call qsort
do something with -0.5
do something with -0.5
do something with -0.5
do something with -1.0
do something with -0.5
call qsort done
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Cython 中传递指向 c 函数的指针? 的相关文章

  • 防止 Python 嵌入在我的默认路径 C:\Python38 中查找模块

    我正在使用 Cython embed模式来生成 exe 我正在评估分发嵌入 Cython 编译的代码并使其在任何机器上运行所需的最少文件集 https stackoverflow com questions 62390978 minimal
  • 在 PyCharm 中,如何在导入的 Cython 扩展代码中断行

    我正在尝试检查该功能LinearNDInterpolator在以下Python代码中调用 from scipy interpolate interpnd import LinearNDInterpolator 我想运行一个调用函数的Pyth
  • 如何使用 Cython 将 Python 3 编译为 C

    我正在尝试将 Python 3 脚本转换为 C 然后将该 C 文件编译为可执行文件 我有这个简单的 python 脚本 def greet name print Hello 0 format name if len name gt 0 el
  • Cython 并行 prange - 线程局部性?

    我正在使用 prange 迭代这样的列表 from cython parallel import prange threadid cdef int tid cdef CythonElement tEl cdef int a b c elLi
  • Cython:在类型声明中使用导入的类

    我正在编写 Cython 0 23 程序 但我不知道如何使用cdef class我在类型声明中从不同的模块导入 这是重现该问题的片段 test py import pyximport pyximport install from mymod
  • 将 cython cdef 扩展数组设置为零

    有没有一种 cython ic 方式来设置cdef数组归零 我有一个具有以下签名的函数 cdef cget values double cpc x double cpc y 该函数的调用方式如下 cdef double cpc x 16 c
  • Cython 程序比普通 Python 慢(10M 选项 3.5s vs 3.25s Black Scholes)-我错过了什么?

    好的 这是我的第一个 Cython 程序 它是为欧洲期货期权定价的代码 没有股息的 Black Scholes 它在 10M 选项上的运行时间为 3 5 秒 而我在下面发布的直接使用 numpy Python 3 25 的代码 谁能指出为什
  • Cython“无法为 cdef 类、结构或联合中的字段分配默认值”

    我正在第一次尝试将 Python 代码移植到 Cython 我对 C 的经验非常有限 我正在尝试创建一个相对简单的类来存储多维数组 为了解决这个问题 我们将属性时间保留为长度为 1 的单个一维数组 目前 我收到错误 cdef np ndar
  • 将 Numpy 数组复制到内存视图

    我有一个memoryview on a numpy数组并想复制另一个数组的内容numpy使用此数组将其放入其中memoryview import numpy as np cimport numpy as np cdef double 1 t
  • 通过 cython 将 python 字符串传递给 C

    我正在尝试编写一个包含一些 c 和一些 python 部分的模块 我正在使用 cython 来弥补差距 我想在 python 中存储我的 很长的 字符串常量 因为它有更好的语法 const char long string npart of
  • Python 3.4:为 64 位 Windows 编译 cython 模块

    我有一个 pyx 模块 我一直在尝试通过各种方式编译它以与 Windows 上的 64 位 python 3 4 一起使用 但没有成功 经过大量的试验和错误 它确实可以编译 python setup py build ext inplace
  • Cython 中的复数

    在 Cython 中处理复数的正确方法是什么 我想使用 dtype np complex128 的 numpy ndarray 编写一个纯 C 循环 在 Cython 中 关联的 C 类型定义在Cython Includes numpy i
  • Cython setup.py 找不到已安装的 Visual C++ 构建工具

    我正在尝试使用此 setup py 文件构建我的 cython 代码 from distutils core import setup from Cython Build import cythonize import numpy as n
  • 导入错误未定义符号(python 中的 C++ 模块)ZTINSt8ios_base7failureB5cxx11E

    我知道网站上有很多类似的问题 但我找不到问题的答案 我使用 Cython 包装 C 类 以便将它们与 Python3 一起使用 使用以下命令构建外部模块后setup py 当我运行 python 程序时 出现以下错误 from name o
  • Cython 和 Python 项目测试驱动开发和 .pyx 文件结构建议

    构建一个的最佳方式是什么python cython项目 以便我可以对驻留在其中的代码进行单元测试 pyx文件 是否可以就地对该代码进行单元测试 或者重构可以让我以另一种方式实现这一目标 我是新来的cython但有 Python TDD mo
  • Cython 优化

    我正在用 Python 编写一个相当大的模拟 并希望从 Cython 获得一些额外的性能 然而 对于下面的代码 我似乎没有得到那么多 即使它包含一个相当大的循环 大约 10 万次迭代 我是否犯了一些初学者错误 或者这个循环大小是否太小而无法
  • 如何在“语言=c++”模式下使用C复数?

    我的大部分库都是用 Cython 在 正常 C 模式下编写的 到目前为止 我很少需要任何 C 功能 但总是假设 有时确实如此 如果我愿意 我可以将一个模块切换到 C 模式 所以我有大约 10 个 C 模式模块和 1 个 C 模式模块 现在的
  • Cython - 将数组指针转换为 Python 对象

    好吧 我已经快完成这个了 我可以尝尝它的味道了 在过去的几周左右的时间里 我一直在尝试创建一个 Python 扩展 以通过 Cython 与用 C 编写的库进行交互 在这里的人和几个朋友的帮助下 我已经成功完成了 98 的任务 唯一剩下的就
  • 为什么我的 pxd 文件的 Cython cimport 不起作用?

    我是 Cython 的新手 所以我可能会遗漏一些明显的东西 但我已经通读了文档并对此进行了一段时间的思考 我有一个 pyx我使用构建的文件setup py文件如下 from distutils core import setup from
  • 如何在 Cython 中传递指向 c 函数的指针?

    我正在尝试打电话qsort在 Cython 中使用自定义比较函数 但我不明白如何传递函数引用 首先 我有一个结构 cdef struct Pair int i j float h 比较函数排序依据h cdef int compare con

随机推荐

  • 如何从 kubernetes 集群内部访问主机的 localhost

    在此应用程序中 nodejs pod 在 kubernetes 内部运行 而 mongodb 本身作为 localhost 位于主机外部 这确实不是一个好的设计 但它只适用于开发环境 在生产中 将有一个单独的 mongodb 服务器 因为这
  • jQuery 中两个数组的合并、存储唯一元素和排序

    var Arr1 1 3 4 5 6 var Arr2 4 5 6 8 9 10 我正在尝试合并这两个数组 输出是 1 3 4 5 6 4 5 6 我用过 merge Arr1 Arr2 这一块将它们合并 使用警报我可以看到像上面这样的合并
  • 搜索拥有超过十亿条记录的数据库的最有效方法?

    我的客户有一个巨大的数据库 仅包含三个字段 主键 无符号数 姓名 多字文本 描述 最多 1000 个 varchar 该数据库拥有超过数十亿条条目 我以前没有处理如此大量数据的经验 他希望我设计一个使用 AJAX 如 Google 的界面来
  • 具有自托管代理的 Azure DevOps Pipeline for Java 项目

    我们有一组使用不同 JDK 版本开发的 Java 项目 项目中使用了不同版本的 Gradle 和 Maven 我们应该使用以下命令创建 Azure DevOps PipelineSelf Hosted Agent截至目前 构建代理服务器已随
  • Visual Studio 2015 - C# Windows 通用应用程序缺少程序集引用

    今天 我将我的 Windows 通用应用程序项目从 github 克隆到运行新安装的 Visual Studio 2015 的新计算机上 项目加载后 我注意到我的所有页面和属性都带有红色下划线 并且有许多错误 CS0246 C The ty
  • Microsoft 的 STL::list::sort() 使用哪种排序算法?

    注 我不小心发帖了这个问题 https stackoverflow com questions 1717773 which sorting algorithm is used by stls listsort没有指定我正在使用哪个STL实现
  • John Resig 的 Javascript 继承片段是否已弃用?

    我正在寻找一种简单的方法来创建两个类 一个类继承另一个类 子类重新定义父类的方法之一 并在新方法中调用父类的方法 例如 有一个班级Animal and Dog 其中 Animal 类定义了一个方法makeSound 它建立了如何输出声音 然
  • 如何处理Kafka流中的不同时区?

    因此 我正在评估 Kafka Streams 及其功能 看看它是否适合我的用例 因为我需要每 15 分钟 每小时 每天聚合传感器数据 并发现它由于其窗口功能而很有用 因为我可以通过应用创建窗口windowedBy on KGroupedSt
  • CSS 可调整大小的带标题的图像

    我正在尝试获取并排显示的两个图像的 HTML 布局 并填充页面 同时保持其纵横比并保持图像彼此相邻 即不在页面每一半的中心 我还想要顶部有一个标题 我几乎已经使用下面的 CSS hackery 实现了这一目标 目前它看起来像这样 如果我水平
  • 使用python远程执行shell脚本

    有没有一种方法可以让我在 Windows 上使用 Python 来执行位于远程 Unix 计算机上的 shell 脚本 P S 抱歉编辑晚了 我确实知道 Paramiko 但我想知道是否有办法在没有它的情况下做到这一点 对于初学者来说 可以
  • Roslyn 脚本:运行时异常的行号信息

    我正在摆弄 Roslyn 脚本的东西 使用Microsoft CodeAnalysis CSharp Scriptingnuget 包 我想知道是否有一种方法可以将行号信息添加到堆栈跟踪中 以了解脚本内发生的异常 当我运行以下 C 代码时
  • 如何执行更新UI视图Android的后台作业[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的 Android 应用程序中 我有一个带有视图的活动 例如 在活动开始或创建主布局时 我想启动一个后台作业 每 5 秒从主布局更
  • CLOB 与 VARCHAR2 以及还有其他替代方案吗?

    我正在为我的应用程序使用 DevArt 的 dotConnect 和 Entity Developer 我已经使用实体优先功能创建了表 我注意到许多列类型都设置为 CLOB 我只有 MySQL 和 Microsoft SQL Server
  • 如何在按下/单击 TextField 时使用 TextFieldValue (带 FocusRequester)将光标设置到文本的任何部分

    我试图环顾四周 但找不到办法 force a focus set the cursor到文本末尾 并且仍然能够设置cursor到文本的任何部分时 按下 点击 With FocusRequester光标设置在文本的开头 但是TextField
  • Spring框架中Service和DAO接口的主要用途是什么?

    我是 Spring 框架的新手 我在谷歌上搜索了很多关于 spring mvc 的网站 我注意到为每个服务和 dao 创建了接口 但我有一些疑问如下 1 为每个service和dao创建接口的主要目的是什么 2 spring mvc的项目结
  • SQL Server VSS 编写器拒绝启动

    我已在 Windows 7 64 位计算机上安装了 Visual Studio 2012 我正在尝试安装 SQL Server Express LocalDB 但当安装程序尝试启动服务时出现错误 这是确切的错误消息 服务 SQL Serve
  • 日期时间类型转换器

    我有下面的代码将字符串转换为 T 类型 它适用于所有其他类型 但当 T 为 DateTime 类型时会出现错误 TypeConverter c TypeDescriptor GetConverter typeof T return T c
  • Avro 架构和生成的文件中的十进制数据类型支持

    这个问题涉及 Avro 版本 1 8 1 我们的 AVRO 模式中有以下字段 name sale price type bytes null logicalType decimal precision 18 scale 17 如您所见 该字
  • scalaz 中的 Store 是什么

    我试图理解Lenses in scalaz 令人惊讶的是没有找到类似的东西cats core 我遇到了所谓的Store这是一个类型别名 type StoreT F A B IndexedStoreT F A A B type Indexed
  • 如何在 Cython 中传递指向 c 函数的指针?

    我正在尝试打电话qsort在 Cython 中使用自定义比较函数 但我不明白如何传递函数引用 首先 我有一个结构 cdef struct Pair int i j float h 比较函数排序依据h cdef int compare con