我在考虑搬我的代码(约30万LOC)从CPython到Script,这样我就可以有更好地整合与我java代码。

是否有一个清单或指导我应该看看,要帮助我的迁移?任何人都不会有的经验与做类似的东西吗?

从阅读 Script网站, ,大多数的问题似乎过于晦涩,来打扰我。

我也注意到:

  • 线安全是一个问题
  • Unicode支助似乎是相当不同,这可能是一个问题,对我来说
  • mysqldb不能工作和需要更换zxJDBC

别的什么吗?

相关的问题: 都有些什么战略来编写代码,适用于CPython,Script和IronPython

有帮助吗?

解决方案 3

我开始这一wiki从收集到的其他答复和我的经验。随编辑和添加的东西,但请尽量坚持的实际建议而不是一个列表中的破事。这里有一个 老名单中的差异 从Script的网站。

资源管理

Script不使用基准计算,并使资源被释放,因为他们 垃圾收集,这是很久以后然后你会看到在等 CPython程序

  • open('file').read() 不会自动关闭该文件。更好的使用 with open('file') as fp 成语。
  • 该__德__方法是援引非常晚在Script代码,不是立即的 最后的参考的目的是删除。

MySQL一体化

mysqldb 是c模块,因此不会的工作在script.而不是你 应该使用 com.ziclix.python.sql.zxJDBC, ,其附带Script.

替换以下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?.

Unicode

  • 你不能表达非法unicode字Script.尝试的东西 喜欢 unichr(0xd800) 会导致一个例外,并具有文字 u'\ud800' 在代码中只会造成严重破坏。

失踪的事情

  • C模块也没有,当然。
  • 操作系统。产卵*功能没有实现。而不是使用子流程.呼叫。

性能

  • 对于大多数工作负荷,Script将大大慢于CPython.报告 任何东西之间3至50倍的速度较慢。

社会

该Script项目仍活着,但是不能快速移动。的 开发的邮件列表 大约有20封邮件有个月,并且似乎只有约2开发商 提交代码最近。

其他提示

首先,我要说的Script执行是非常好的。大多数事情"仅仅是工作"。

这里有一些东西,我遇到的:

  • C模块也没有,当然。

  • open("文件").read()并不会自动关闭该文件。这与的差异在垃圾的收集器。这可能会导致的问题与许多公开的文件。这是最好使用"有开放("文件")为fp"惯用语。

  • 设定当前的工作目录(使用操作系统。setcwd())适用于代码,但不适用于Java代码。它模仿当前的工作目录中的一切文件相关的,但只能这样做Script.

  • XML分析将尝试,以验证外部DTD如果它是可用的。这可能会导致大规模的下降XML代码处理,因为分析程序将载DTD通过网络。我 报道这个问题, 但迄今为止它仍然不固定。

  • 该__德__方法是援引非常晚在Script代码,不能立即在最后的参考的目的是删除。

还有一个 老名单中的差异, 但最近的清单是不可能的。

迄今为止,我已经注意到的另外两个问题:

  • 串的实习'a'是'a'不能保证(这是一次执行情况侥幸在CPython).这可能是一个严重的问题,并真的是在一个图书馆我被移植(Jinja2).单元测试(以始终)你最好的朋友!
Jython 2.5b0 (trunk:5540, Oct 31 2008, 13:55:41)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
False
>>> 'a' == s   
True
>>> intern('a') is intern(s)
True

这里是同一届会议上CPython:

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
True
>>> 'a' == s
True
>>> intern('a') is intern(s)
True

  • 操作系统。产卵*功能没有实现。而不是使用子流程.呼叫。我感到惊讶的是真的,作为实现使用子流程.叫将是容易的,并且我是肯定的,他们将接受修补程序。

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

当我打开一个项目从CPython到Script前一段时间我意识到一个速度下达到50倍于时间的关键部分。因为我住CPython.

然而,这可能具有改变现在与目前的版本。

你可能还需要的研究 JPype.我不知道该怎么成熟,这是相比Script,但它应该允许CPython访问Java代码。

最近,我曾在一个项目,用于教授在我的学校与一个小组。在初期,它是决定,我们将编写项目在蟒蛇。我们肯定应该有用CPython.我们写的程序在Python和我们的所有单元的测试,最终的工作。因为大多数人已经有Java他们的计算机上安装,而不蟒蛇,我们决定就部署它作为一个Script罐子。因此,我们写的界摆动,因为这是包含在Java的标准图书馆。

第一次我遇的程序与Script,它坠毁。一csv。阅读器"。字"似乎总是没有。因此,我不得不改变几个部分的我们的代码的工作围绕这一点。

一个不同的部分,我的代码崩溃,以及,其工作的现有CPython.Script被告我引用一个变量之前,它是分配的任何东西(其把我的坚果和真的不是在情况)。这是一个例子: ActiveState的代码的食谱是外部进行排序

更糟的是,性能是可怕的。基本上,这个代码相结合几个CSV文件,其中之一是大约2GB。在CPython,它跑了8.5分钟。在Script,它跑了25分钟。

这些问题发生了2.5.2rc2(最新的时写这篇文章).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top