【问题标题】:Fastest way to run Java jar file from Python?从 Python 运行 Java jar 文件的最快方法是什么?
【发布时间】:2012-03-17 17:48:42
【问题描述】:

这是我的问题。我有一个必须在我的程序中使用的现有 .jar 文件。但是,该程序是用 Python 编写的。

由于我的程序需要很长时间才能运行(大型开发语料库上的命名实体标记器),因此我使用 cProfiler 对其进行了分析,并使用 line_profiler 对其进行了衬里分析。似乎 92% 的时间都花在了这项任务上。

我目前正在使用以下代码:

import subprocess as sub
sub.call(["java", "-jar", "-Xmx512m", "MyFile.jar", 
         featuresFileName, numIterations, featureCutOff])

我在某处读到过有关 subprocess vs Popen 和其他零碎的信息,但找不到不需要子进程或 os 调用的好解决方案(当然,可能没有)。

我非常感谢有关从 Python 脚本中运行 .jar 文件的最快方法的建议。但是请注意,我无法修改 Java 代码,也无法与该代码的开发人员交谈。

另外,我不知道这是否会有所帮助,或者我只是在这里抓住稻草,但也许有一种方法可以将上面sub.call() 中调用的进程保持在后台,以某种方式保持 JVM运行(?),以便我可以简单地调用 jar 文件。也许这可以帮助降低启动成本?顺便说一句,我是一个 Java 新手(主要是 C++、C#、Python 经验),所以我的问题毫无意义 - 我提前道歉......

【问题讨论】:

    标签: java python performance optimization


    【解决方案1】:

    您可以尝试将您的 Python 移植到 Jython,然后在同一个 JVM 中以本机方式运行它(这可能有效,也可能无效)。这样一来,您的启动时间实际上为零,并且 JVM 有足够的时间随着时间的推移利用其 JIT 来理想地为您提供更好的整体性能。

    【讨论】:

    • 如果你把它移植到 Jython,我相信你可以把它变成一个 Java 本地库,就像人们在 CPython 中使用 C 库那样,然后像 Python 模块一样调用它。
    【解决方案2】:

    这表明大部分时间都花在了这个过程中。问题可能不是启动时间。它可能是它一旦开始就会做的事情。

    我能想到的唯一解决方法是在后台运行该进程,如果可以的话,可以同时多次运行。 (并发而不是一个接一个地运行)

    【讨论】:

    • 我也在朝着那个方向前进......不幸的是,我必须在算法的每一次通过中运行一次,当我意识到我意识到我没有机会进行并发时。
    • 听起来如果你想让它更快,你将不得不更改 Java 代码。改善启动时间的标准方法是将 jar 作为服务运行,您可以通过添加另一个调用它的 jar 来实现。这样做的好处是您的服务一直在运行(即不启动)
    • 这正是我刚刚编辑我的问题要问的内容:) 应该先刷新页面...我要尝试一下,当我有一些结果时会回复...谢谢!
    【解决方案3】:

    尝试使用“-client”选项。它应该会减少 JVM 启动时间。

    【讨论】:

      【解决方案4】:

      通过分析jar 文件的manifest 文件可以找出使用的jar 文件的类名。因此,原则上您可以编写自己的小型 Java 守护程序,它正在侦听新参数的到达并调用适当类的 main() 函数。但只有当启动成本成为问题时,才真正值得付出努力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多