需求背景进击的 Python 随着人工智能的兴起,Python 这门曾经小众的编程语言如今已经大放异彩,特别是在机器学习、深度学习领域。在 TIOBE 编程语言排行榜上,Python 坐上前三甲的宝座,仅次于 Java 和 C。然而,不同的编程语言在企业中并存,例如在某些企业中同时存在 Python 研发团队和 Java 研发团队。Python 团队专注于 AI 算法开发,而 Java 团队则负责将这些算法工程化,提供给上层应用使用。这就引出了问题:如何让 Java 工程化团队调用 Python 的算法能力?
解决方案:Python 通过 Django/Flask 等框架启动一个 Web 服务,Java 中通过 Restful API 与之进行交互。然而,这种方式随之而来的是性能问题,尤其是在用户量上升后,大量并发接口访问可能会成为瓶颈。
改进方案:将 Python 代码转换成 Java 可以直接本地调用的模块。主要有两种方法:在 JVM 中直接执行 Python 脚本或把 Python 代码转换成 Native 代码块,Java 通过 JNI 的接口形式调用。
核心工具:Cython。Cython 是一个 Python 语言规范的超集,可以将 Python+C 混合编码的.pyx 脚本转换为 C 代码,用于优化 Python 脚本性能或 Python 调用 C 函数库。
实现步骤:使用 Cython 工具编译生成动态库,准备 Java JNI 调用的接口文件,封装为 Jar 包。通过自动化的 Python 脚本将整个过程自动化,解决了代码导入和 GIL 锁问题。
测试效果:准备两份一模一样的 py 文件,通过 Flask Web 接口访问和上述过程转换成 Jar 包的版本,分别在 Java 服务中调用接口 100 次,整个测试工作进行 10 次,统计执行耗时,得出性能对比。
总结:本文提供了一种 Java 调用 Python 代码的思路,虽然方法成熟度和稳定性还有待验证,但通过 HTTP Restful 接口访问仍然是跨语言对接的首选。有兴趣的朋友可留言交流。
温馨提示:答案为网友推荐,仅供参考