24

我正在考虑将我的代码(大约 30K LOC)从 CPython 移动到 Jython,以便我可以更好地与我的 java 代码集成。

是否有我应该查看的清单或指南来帮助我进行迁移?有没有人有做类似事情的经验?

通过阅读Jython 站点,大多数问题似乎都太模糊而无法困扰我。

我确实注意到:

  • 线程安全是个问题
  • Unicode 支持似乎完全不同,这对我来说可能是个问题
  • mysqldb 不行,需要换成zxJDBC

还要别的吗?

相关问题:编写适用于 CPython、Jython 和 IronPython 的 python 代码的一些策略是什么

4

6 回答 6

10

首先,我不得不说 Jython 的实现非常好。大多数事情“正常工作”。

以下是我遇到的一些情况:

  • 当然,C 模块不可用。

  • open('file').read() 不会自动关闭文件。这与垃圾收集器的差异有关。这可能会导致打开文件过多的问题。最好使用“with open('file') as fp”成语。

  • 设置当前工作目录(使用 os.setcwd())适用于 Python 代码,但不适用于 Java 代码。它模拟所有与文件相关的当前工作目录,但只能为 Jython 这样做。

  • XML 解析将尝试验证外部 DTD(如果可用)。由于解析器将通过网络下载 DTD,这会导致 XML 处理代码的速度大幅下降。我报告了这个问题,但到目前为止它仍未修复。

  • __ del __ 方法在 Jython 代码中很晚才被调用,而不是在对对象的最后一个引用被删除之后立即调用。

有一个旧的差异列表,但没有最近的列表。

于 2010-04-05T13:03:03.387 回答
8

到目前为止,我注意到了另外两个问题:

  • 不能保证字符串实习 'a' 是 'a' (它只是 CPython 上的一个实现侥幸)。这可能是一个严重的问题,并且确实存在于我正在移植的一个库中(Jinja2)。单元测试(一如既往)是你最好的朋友!
Jython 2.5b0(主干:5540,2008 年 10 月 31 日,13:55:41)
>>> 'a' 是'a'
真的
>>> s = 'a'
>>> 'a' 是 s
错误的
>>> 'a' == s   
真的
>>> intern('a') 是实习生
真的

这是关于 CPython 的同一会话:

Python 2.5.2(r252:60911,2008 年 10 月 5 日,19:24:49)
>>> 'a' 是'a'
真的
>>> s = 'a'
>>> 'a' 是 s
真的
>>> 'a' == s
真的
>>> intern('a') 是实习生
真的

  • os.spawn* 函数未实现。而是使用 subprocess.call。我真的很惊讶,因为使用 subprocess.call 的实现很容易,而且我相信他们会接受补丁。

(我一直在做和你类似的事情,最近移植了一个应用程序)

于 2009-01-07T17:01:35.137 回答
5

我从其他答案和我的经验中收集了一个 wiki。随意编辑和添加东西,但请尽量坚持实用的建议,而不是列出损坏的东西。这是与 Jython 站点不同的旧列表。

资源管理

Jython 不使用引用计数,因此资源在被垃圾回收时被释放,这比您在等效的 CPython 程序中看到的要晚得多

  • open('file').read()不会自动关闭文件。最好使用with open('file') as fp成语。
  • __ del __ 方法在 Jython 代码中很晚才被调用,而不是在对对象的最后一个引用被删除之后立即调用。

MySQL 集成

mysqldb是 ac 模块,因此在 jython 中不起作用。相反,您应该使用com.ziclix.python.sql.zxJDBC与 Jython 捆绑在一起的 .

替换以下 MySQLdb 代码:

connection = MySQLdb.connect(host, user, passwd, db, use_unicode=True, chatset='utf8')

和:

url = "jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" % (host, db)
connections = zxJDBC.connect(url, user, passwd, "com.mysql.jdbc.Driver")

您还需要将所有内容替换_mysql_exceptionzxJDBC.

最后,您需要将查询占位符从 替换%s?

统一码

  • 您不能在 Jython 中表达非法的 unicode 字符。尝试类似的事情unichr(0xd800)会导致异常,并且u'\ud800' 在代码中包含文字只会造成严重破坏。

丢失的东西

  • 当然,C 模块不可用。
  • os.spawn* 函数未实现。而是使用 subprocess.call。

表现

  • 对于大多数工作负载,Jython 将比 CPython 慢得多。报告的速度要慢 3 到 50 倍。

社区

The Jython project is still alive, but is not fast-moving. The dev mailing list has about 20 messages a month, and there seem to be only about 2 developers commiting code lately.

于 2010-12-19T07:31:54.273 回答
3

前段时间,当我将一个项目从 CPython 切换到 Jython 时,我意识到时间关键部分的速度降低了高达 50 倍。正因为如此,我留在了 CPython。

但是,现在的版本可能已经改变了。

于 2009-05-11T11:03:51.723 回答
3

您可能还想研究JPype。我不确定它与 Jython 相比有多成熟,但它应该允许 CPython 访问 Java 代码。

于 2010-04-05T13:10:55.233 回答
2

最近,我和一个小组一起为我学校的一位教授做一个项目。早期,我们决定用 Python 编写项目。我们绝对应该使用 CPython。我们用 Python 编写了程序,我们所有的单元测试最终都成功了。因为大多数人已经在他们的计算机上安装了 Java,而不是 Python,所以我们决定将其部署为 Jython jar。因此,我们使用 Swing 编写了 GUI,因为它包含在 Java 的标准库中。

我第一次使用 Jython 运行程序时,它立即崩溃了。一方面,csv.reader 的“.fieldnames”似乎总是无。因此,我不得不更改我们代码的几个部分来解决这个问题。

我的代码的另一部分也崩溃了,它在 CPython 上运行良好。Jython 指责我在分配任何东西之前引用了一个变量(这让我发疯了,事实并非如此)。这是一个例子:ActiveState's Code Recipe's external sort

更糟糕的是,表演很糟糕。基本上,这段代码结合了几个 CSV 文件,其中一个大约 2 GB。在 CPython 中,它在 8.5 分钟内运行。在 Jython 中,它在 25 分钟内运行。

这些问题发生在 2.5.2rc2(撰写本文时的最新版本)。

于 2010-12-16T21:28:04.387 回答