我目前正在使用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解释器,有人能给出什么建议吗?
发布于 2021-09-09 20:50:37
cppyy嵌入接口还没有文档,因为它在PyPy/cppyy上不起作用(这似乎是你最特别要求的),只在CPython上起作用。对于后者,我不一定知道它是否/如何比boost.python或pybind11快,因为它仍然依赖于装箱变量和C-API来调用Python.潜在地,C++类型查找更快,但仅此而已。
您可以很容易地使用它来获取一些性能数据,首先从C++ (Cling)从cppyy调用Python,看看它是什么样子。下面是一个简单的例子:
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是友好的
https://stackoverflow.com/questions/69121887
复制相似问题