2010-01-21 90 views
0

我正在编写一个使用插件的应用程序。有两种类型的插件:EngineModelEngine对象具有调用Model.velocity()方法的update()方法。在两个python模块之间传递C函数指针

出于性能的考虑,这些方法允许要写入C.这意味着,他们有时会用Python编写,有时用C写的

的问题是,这个力量做一个昂贵的Python功能呼叫Model.velocity()Engine.update()(并重新获取GIL)。我曾考虑过在API中添加Model.get_velocity_c_func()之类的东西,如果可用,允许Model实现返回一个指向其C版本velocity()方法的指针,这使得Engine可以执行更快的C函数调用。

应该使用什么数据类型来传递函数指针?这是一个很好的设计,也许有一个更简单的方法?

回答

1

CObject(PyCOBject)数据类型为此而存在。它拥有一个void *,但是你可以存储任何你想要的数据。您必须小心,不要将错误的CObject传递给错误的函数,因为其他库的CObjects看起来就像您自己的。

如果你想要更多的类型安全性,你可以很容易地为你自己推出PyType;毕竟,它所要做的就是包含一个正确类型的指针。

+0

我该如何将这个从我的'Model'传递给'Engine'?我从“引擎”的角度来看都是当前使用的“Model”的Python实例,我不知道如何从“Engine”中调用“Model”中的C代码(它甚至可能不存在) 'Engine'。 – 2010-01-21 02:05:40

+0

我意识到我的评论没有意义......我的意思是,我如何将PyCObject从C传递给Python? – 2010-01-21 02:33:49

+0

不要紧,我现在明白了,我只是在两边执行PyCObject_FromVoidPtr/PyCObject_AsVoidPtr,谢谢:) – 2010-01-21 03:46:15