首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cppyy代替boost-python嵌入Python

如何使用cppyy代替boost-python嵌入Python
EN

Stack Overflow用户
提问于 2021-09-09 16:37:38
回答 1查看 85关注 0票数 0

我目前正在使用boost-python将Python解释器嵌入到我的C++应用程序中,并按照https://www.boost.org/doc/libs/1_75_0/libs/python/doc/html/tutorial/tutorial/embedding.html将数据从已执行的Python进程通过boost-python绑定传递到正在运行的C++应用程序

我在性能方面遇到了一些麻烦,特别是当调用带有大量参数的包装函数时,解析和装箱所有这些参数以“传递”到C++“端”的开销是相当大的。

我检查了boost-python的替代品,例如pybind11,它也可以嵌入,但性能不太可能提高。我也发现了cppyy,但从文档中我不知道如何方便地将解释器嵌入到我的程序中,或者更确切地说,我应该如何转换我当前的嵌入式解释器方法以能够使用cppyy。我尝试使用cppyy的目的是检查使用cppyy和/或PyPy作为解释器是否可以提高代码的性能,因为boost-python和pybind11都不支持嵌入PyPy。

如何用cppyy替换使用boost-python的嵌入式Python解释器,有人能给出什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-09 20:50:37

cppyy嵌入接口还没有文档,因为它在PyPy/cppyy上不起作用(这似乎是你最特别要求的),只在CPython上起作用。对于后者,我不一定知道它是否/如何比boost.python或pybind11快,因为它仍然依赖于装箱变量和C-API来调用Python.潜在地,C++类型查找更快,但仅此而已。

您可以很容易地使用它来获取一些性能数据,首先从C++ (Cling)从cppyy调用Python,看看它是什么样子。下面是一个简单的例子:

代码语言:javascript
复制
import cppyy
import time

N = 10000000

def pycall(a):
    return a

cppyy.cppdef("""\
int (*ptr)(int) = 0;
void func(uint64_t N) {
    for (uint64_t i = 0; i < N; ++i)
        ptr(1);
}""")

cppyy.gbl.ptr = pycall

ts = time.perf_counter()
cppyy.gbl.func(N)
print('time per call:', (time.perf_counter()-ts)/N)

要使用您自己的代码和类型,而不是int,只需使用cppyy.include包含头文件并使用cppyy.load_library()加载库即可。在Python端的C++和Python端的cppyy都将拥有完全的访问权限,因此您可以在回调中使用这些类型。

如果数字看起来更好,您需要的主要部分在CPyCppyy/API.h中,请参阅此处:https://github.com/wlav/CPyCppyy/blob/master/include/CPyCppyy/API.h

不过,目前我最好的建议是CFFI,它只支持C语言,但会给你提供可以直接使用的回调函数,而且在PyPy:https://cffi.readthedocs.io/en/latest/embedding.html上对JIT是友好的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69121887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档