迁徙的自CPython到Script
题
我在考虑搬我的代码(约30万LOC)从CPython到Script,这样我就可以有更好地整合与我java代码。
是否有一个清单或指导我应该看看,要帮助我的迁移?任何人都不会有的经验与做类似的东西吗?
从阅读 Script网站, ,大多数的问题似乎过于晦涩,来打扰我。
我也注意到:
- 线安全是一个问题
- Unicode支助似乎是相当不同,这可能是一个问题,对我来说
- mysqldb不能工作和需要更换zxJDBC
别的什么吗?
解决方案 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_exception
与 zxJDBC
.
最后,你会需要更换的查询,从占位 %s
要 ?
.
Unicode
- 你不能表达非法unicode字Script.尝试的东西
喜欢
unichr(0xd800)
会导致一个例外,并具有文字u'\ud800'
在代码中只会造成严重破坏。
失踪的事情
性能
- 对于大多数工作负荷,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(最新的时写这篇文章).