Python 调用 c 这两种做法的不同

2020-09-09 22:35:10 +08:00
 zxCoder

1 直接编译成一个可执行文件,然后 python 里执行命令 ./main -xx xxxx,传几个简单的参数 2 编译成动态库,然后 python 去调用这个动态库,再去执行对应的函数

这两种方法有很大区别吗?第 1 种很少见的原因是因为安全性问题吗?还是还有其他的问题?

1230 次点击
所在节点    问与答
9 条回复
weyou
2020-09-09 23:18:26 +08:00
第一种也不少见啊, 得看使用场景了,其实就是把 Python 当作 shell 用呗。这种方式受限于命令行参数,复杂一点的结构化参数就比较难办,需要参数来回转换,而且需要起另外的进程,此外获取此进程的返回值也没有第二种方法直接,也需要自行转换。如果是高频度的函数调用,这种方式显然比第二种效率低下。
billlee
2020-09-09 23:23:04 +08:00
fork-exec 的开销还是比 function call 大得多的
ipwx
2020-09-09 23:41:23 +08:00
恰恰相反,如果考虑安全性或者环境等乱七八糟的事情,第一种是很好的选择。

选择第二种是为了效率。启动一个新进程开销特别大。
hakono
2020-09-09 23:44:02 +08:00
第二种,开发调试起来是噩梦
ysc3839
2020-09-10 00:45:06 +08:00
区别算大吧,前者需要启动新进程,后者是在当前进程中执行的。
前者很少见可能是因为不便于传递数据。
SingeeKing
2020-09-10 00:49:29 +08:00
第一种一方面涉及创建进程,另一方面交互很受限
Tony042
2020-09-10 01:59:17 +08:00
@hakono 第二种用 C 写好,把 C 的函数都测试好,直接用 pybind11 包一下不就可以了,我感觉 C 这边的 unit test 做好,调试应该不费劲
swulling
2020-09-10 07:21:13 +08:00
第一种开销比较大,看频率了
频率不高可以用第一种
zxCoder
2020-09-10 10:25:05 +08:00
@swulling 那如果是把 c 部分再封装一个 http 或者 rpc 服务来调用,这种方法对比前两种方法效率如何呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/705628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX