将python打包成exe后启动都比较慢,有没有优化的办法

4,945 views
Skip to first unread message

jamiesun

unread,
Nov 26, 2012, 2:25:21 AM11/26/12
to python-cn
试过py2exe,pyinstall,不管是单一文件还是目录,都比较慢。

不知道慢的原因主要在哪里,如果可以在系统启动做一些预加载也好。

gelin yan

unread,
Nov 26, 2012, 3:33:27 AM11/26/12
to pyth...@googlegroups.com


2012/11/26 gelin yan <dyna...@gmail.com>


2012/11/26 jamiesun <jamies...@gmail.com>
试过py2exe,pyinstall,不管是单一文件还是目录,都比较慢。

不知道慢的原因主要在哪里,如果可以在系统启动做一些预加载也好。

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
 
 

我一直用cx_freeze,没什么问题 


gelin yan

unread,
Nov 26, 2012, 3:33:24 AM11/26/12
to pyth...@googlegroups.com


2012/11/26 jamiesun <jamies...@gmail.com>
试过py2exe,pyinstall,不管是单一文件还是目录,都比较慢。

不知道慢的原因主要在哪里,如果可以在系统启动做一些预加载也好。

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
 
 

我一直用cx_freeze,没什么问题 

Jimmy Kuu

unread,
Nov 26, 2012, 3:56:37 AM11/26/12
to python-cn
我是用Splash窗口,加进度条,把一些费时的模块在Splash窗口启动后import


在 2012年11月26日 下午3:25,jamiesun <jamies...@gmail.com>写道:
试过py2exe,pyinstall,不管是单一文件还是目录,都比较慢。

不知道慢的原因主要在哪里,如果可以在系统启动做一些预加载也好。

--

jamiesun

unread,
Nov 26, 2012, 4:20:35 AM11/26/12
to pyth...@googlegroups.com
直接执行脚本是很快的,脚本内容本身也不费时,用Splash窗口估计也没有用,Splash跳出来说不定都要好久。

觉得问题应该在python runtime的建立上。另外我用了tk,用qt估计还会慢一点。

我在使用uipad的exe时也是感觉很慢,用python直接启动脚本就很快。


cx_freeze会更好吗,我试试看

gelin yan

unread,
Nov 26, 2012, 4:38:40 AM11/26/12
to pyth...@googlegroups.com


2012/11/26 jamiesun <jamies...@gmail.com>

打包机制,py2exe, cx_freeze都是大同小异。不会说哪一个会更快。我原来用py2exe打包过wxpython的程序肉眼看不出启动的差别。现在用cx_freeze打包的程序和gui无关,更加看不出差别。

我用cx_freeze只是它还继续更新,而且能支持多个平台。py2exe貌似老早就停了。

Shell Xu

unread,
Nov 26, 2012, 9:38:35 AM11/26/12
to pyth...@googlegroups.com
你用cython把所有的代码都改写掉编译成C吧,理论上只比纯C程序多个0.x秒的python runtime启动时间。。。

在 2012年11月26日 下午3:25,jamiesun <jamies...@gmail.com>写道:
试过py2exe,pyinstall,不管是单一文件还是目录,都比较慢。

不知道慢的原因主要在哪里,如果可以在系统启动做一些预加载也好。

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
 
 



--
无能者无所求,饱食而遨游,泛若不系之舟
blog: http://shell909090.com/blog/
twitter: http://twitter.com/shell909090

jamiesun

unread,
Nov 26, 2012, 9:01:05 PM11/26/12
to pyth...@googlegroups.com
程序整个启动要5,6秒啊,排除python runtime,加载GUI需要这么久。无论wx,qt,tk。

看来只有调用win32gui是最快的。

Shell Xu

unread,
Nov 26, 2012, 9:12:56 PM11/26/12
to pyth...@googlegroups.com
。。。无论哪种gui框架,在windows下的底层都是调用win sdk api的。唯一的例外就是wpf/...(一时脑残,java的那个自己绘图的叫啥来着?swing?)。

Flya Flyaa

unread,
Nov 26, 2012, 9:25:21 PM11/26/12
to pyth...@googlegroups.com
你加这个没?  "optimize": 2,
我用pyside一点也不觉得慢。

2012/11/27 Shell Xu <shell...@gmail.com>:

--
http://www.fminer.com

Leo Jay

unread,
Nov 27, 2012, 12:28:54 AM11/27/12
to python-cn:CPyUG
2012/11/27 Flya Flyaa <flya...@gmail.com>:
> 你加这个没?  "optimize": 2,
> 我用pyside一点也不觉得慢。
>

我没用过py2exe,但如果你这个"optimize": 2等效于python命令行的-OO参数的话,这个所谓的optimize只是把doc
string,以及assert语句去掉而已,并不会加快运行速度。

--
Best Regards,
Leo Jay

Flya Flyaa

unread,
Nov 27, 2012, 1:11:30 AM11/27/12
to pyth...@googlegroups.com
不止这些,它会把py文件编译成pyo,我觉得会快些。

2012/11/27 Leo Jay <python...@gmail.com>:

Shell Xu

unread,
Nov 27, 2012, 5:25:45 AM11/27/12
to pyth...@googlegroups.com

那不是一回事?

from miui

ubunoon

unread,
Nov 27, 2012, 5:58:22 AM11/27/12
to pyth...@googlegroups.com
快和慢,在于你加载的时候代码的执行速度,和python还是gui没什么大的关系

如果你加载的东西多,又比较费时,那么用python会稍微慢一些。

所以关键是找出费时的那些代码,简单一些就用二分法进行查找,没找一次写一次日志,估计你很快就可以找到运行慢的代码。

对于pyo之类的,速度并没有多少的提升,毕竟python是解释型的,不是翻译型的。
DamonChen
让生活更俏皮些


Flya Flyaa

unread,
Nov 27, 2012, 7:58:47 AM11/27/12
to pyth...@googlegroups.com
我不这样认为,pyc,pyo肯定比py快,否则py执行时也不会先编译成pyc文件。

2012/11/27 ubunoon <net...@gmail.com>:

Wang Xuerui

unread,
Nov 27, 2012, 8:27:48 AM11/27/12
to pyth...@googlegroups.com
在 2012年11月27日 下午8:58,Flya Flyaa <flya...@gmail.com> 写道:
> pyc,pyo肯定比py快,否则py执行时也不会先编译成pyc文件。
其实就是少了source parsing和bytecode compilation的时间。。

Shell Xu

unread,
Nov 27, 2012, 9:31:34 AM11/27/12
to pyth...@googlegroups.com
pyc快是肯定的。pyc是python源码经过compile后得到的字节码,经过marshal,加上时间戳而已。compile是很耗时的。
而pyo则是从中去除了doc string。基本时间没什么变化。
但是我也可以让py效率和pyc差不多,方法是利用packpy。对了,也和我的packpy用户说一声——
——这个程序在混淆的同时,会让pyc和py一样慢哦。
原理是这样的。
packpy是利用zip和base64来将py源码转换为string,放在内部。在pyc编译后,这个string还是原生的。在启动时,无论是pyc还是py,都需要把这个字符串加载起来——两者的时间差异相差无几。然后经过compile,再执行。
既然都要compile,pyc就一点加速作用也没有了。
不过一般脚本都是以python script.py执行的,此时是不保存pyc的(其实作用不止如此),所以也就不考虑这么多了。

2012/11/27 Wang Xuerui <idontk...@gmail.com>
在 2012年11月27日 下午8:58,Flya Flyaa <flya...@gmail.com> 写道:
> pyc,pyo肯定比py快,否则py执行时也不会先编译成pyc文件。
其实就是少了source parsing和bytecode compilation的时间。。
--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp





--

jamiesun

unread,
Nov 27, 2012, 10:36:45 PM11/27/12
to pyth...@googlegroups.com
pyc,pyo可以节约些时间,但是并不明显,我现在的慢应该就是GUI的初始化慢。

以脚本模式执行非常快,而打包后却很慢,开始怀疑是因为exe压缩后解压造成的的,但是我不打包成单个exe还是一样慢。

cx_freeze,也用了,还是慢,我现在用的是tk,qt的我都有试过,都是不同层度的慢。

Leo Jay

unread,
Nov 27, 2012, 11:00:10 PM11/27/12
to python-cn:CPyUG
2012/11/28 jamiesun <jamies...@gmail.com>:

> pyc,pyo可以节约些时间,但是并不明显,我现在的慢应该就是GUI的初始化慢。
>
> 以脚本模式执行非常快,而打包后却很慢,开始怀疑是因为exe压缩后解压造成的的,但是我不打包成单个exe还是一样慢。
>
> cx_freeze,也用了,还是慢,我现在用的是tk,qt的我都有试过,都是不同层度的慢。
>

你愿意试一下我的方法么:
http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage

这个方法相对于py2exe之类的工具可能是麻烦了一些,但好处是,python的库跟自己的代码是分开的,软件更新的时候,只要更新自己的代码就好了。

我没做过测试,但我的方法里没有什么很tricky的地方,所以我想速度上应该跟直接执行脚本是一样的。
你可以试试看。

Message has been deleted

宅人

unread,
Nov 28, 2012, 7:18:45 AM11/28/12
to pyth...@googlegroups.com
只是压缩和base64,就别说是混淆了;而且我觉得要达到尽可能减小大小的目的,就别用base64编码。
原始源码的pyc比py确实会有点速度优势,但有时候觉得主要原因可能不在这,因为往往打包成exe后是第一遍启动慢,后面再启动则快了,不管exe中是pyc还是pyo抑或py。

在 2012年11月27日星期二UTC+8下午10时32分31秒,shell909090写道:

Wang Xuerui

unread,
Nov 28, 2012, 7:25:34 AM11/28/12
to pyth...@googlegroups.com
在 2012年11月28日 下午8:18,宅人 <www....@gmail.com> 写道:
> 往往打包成exe后是第一遍启动慢,后面再启动则快了,不管exe中是pyc还是pyo抑或py。
操作系统对所使用动态链接模块的缓存?这个解决方案倒是有,开机时用个accelerator程序做预读取来warm up
cache,不过估计用户机器上的电脑管家要开始叫嚣了

greatghoul

unread,
Nov 28, 2012, 7:43:04 AM11/28/12
to pyth...@googlegroups.com
像市面上这些机器管家,它是根据什么规则认定哪些文件是垃圾文件。

比如我程序正常的缓存可以加速某些功能的运行速度,管家把这些缓存干掉后会不会反而使程序变慢?
--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp




--
greatghoulAsk and Learn

Shell Xu

unread,
Nov 28, 2012, 7:56:31 AM11/28/12
to pyth...@googlegroups.com

变量名都不替换的。这东西本来是为了脚本直接通过邮件和聊天工具发还能工作而做的。

from miui

在 2012-11-28 下午8:09,"宅人" <www....@gmail.com>写道:
只是压缩和变量名替换,就别说是混淆了;而且我觉得要达到减小大小的目的,就别用base64编码。

在 2012年11月27日星期二UTC+8下午10时32分31秒,shell909090写道:

依云

unread,
Nov 28, 2012, 10:16:47 AM11/28/12
to pyth...@googlegroups.com
On Wed, Nov 28, 2012 at 08:43:04PM +0800, greatghoul wrote:
> 像市面上这些机器管家,它是根据什么规则认定哪些文件是垃圾文件。
>
> 比如我程序正常的缓存可以加速某些功能的运行速度,管家把这些缓存干掉后会不会反而使程序变慢?

我猜是能删就删吧。(所以很多人不管是 Windows 还是 Android 什么的喜欢清缓
存我就很不理解。)

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
http://lilydjwg.is-programmer.com/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

Linker

unread,
May 6, 2013, 1:29:13 AM5/6/13
to pyth...@googlegroups.com
用Cython绝对是正确的选择。


2012/11/26 Shell Xu <shell...@gmail.com>



--
Regards,
Linker Lin

linker...@gmail.com

风间星魂

unread,
May 6, 2013, 1:35:50 AM5/6/13
to pyth...@googlegroups.com
根据我读pyexe源码和反向经验。
pyexe打包会把大部分库编译为pyc后打包到一个文件里。除了zlib和少数几个依赖
然后把主启动pyc文件放进pe资源段里。
启动exe
会启动pyexe自己的c入口,装载python动态库,然后先装载zlib,提取出主启动依赖的pyc,然后在开始运行。
不慢才见鬼了。



严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 



--
求武汉任意unix职位,3年ios经验。。
正在编写一个基于opengl es2.0 c++ 2d/3d引擎


技术博客地址:fengjian.sinaapp.com

风间星魂

unread,
May 6, 2013, 1:40:57 AM5/6/13
to pyth...@googlegroups.com
顺便补充一句,我对用python写还打包的行为嗤之以鼻。。

xuxiaoyuan

unread,
May 6, 2013, 5:14:50 AM5/6/13
to pyth...@googlegroups.com
说说我的经验,看lz的回复,貌似只是GUI程序吧,以前打包过 PyQt的程序,打包成EXE后,每次启动都会很慢。
至于时间都耗到哪了,我认为是耗在 import PyQt 的package上了。

至于lz所说直接用脚本启动会很快,所以怀疑是py2exe的问题。
我认为不是的,试试重新开机,然后第一次用脚本启动,和用EXE的时间差不多,后边再启动就非常快,至于为什么用脚本启动只有第一次很耗时,而后边就很快,这里有解释http://woodpecker.org.cn/diveintopython/file_handling/more_on_modules.html.

如果不是import 很大的package,那么时间估计就花在 run time上了吧,这个时间是多少,没有试验过。
至于解决方法,如果是 GUI程序的话,加个splash窗口吧,一些和GUI无关的package比如numpy,scipy神马的就放后面import,GUI相关的package就没办法了。

在 2012年11月26日星期一UTC+8下午3时26分19秒,jamiesun写道:

Chunlin Zhang

unread,
May 6, 2013, 8:11:53 AM5/6/13
to python-cn`CPyUG`华蟒用户组
不是 gui 的也会慢,我同事刚有一个命令行的工具,用的是pyinstall,第三方的库只用到了requests,运行起来就是慢


2013/5/6 xuxiaoyuan <awesome...@gmail.com>

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
您收到此邮件是因为您订阅了 Google 网上论坛“python-cn(华蟒用户组,CPyUG 邮件列表)”中的主题。
要退订此主题,请访问 https://groups.google.com/d/topic/python-cn/_-_vXrrjQ60/unsubscribe?hl=zh-CN。
要退订此论坛及其所有主题,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 

依云

unread,
May 6, 2013, 11:06:49 AM5/6/13
to pyth...@googlegroups.com
On Mon, May 06, 2013 at 02:14:50AM -0700, xuxiaoyuan wrote:
> 说说我的经验,看lz的回复,貌似只是GUI程序吧,以前打包过 PyQt的程序,打包成EXE后,每次启动都会很慢。
> 至于时间都耗到哪了,我认为是耗在 import PyQt 的package上了。
>
> 至于lz所说直接用脚本启动会很快,所以怀疑是py2exe的问题。
> 我认为不是的,试试重新开机,然后第一次用脚本启动,和用EXE的时间差不多,后边再启动就非常快,至于为什么用脚本启动只有第一次很耗时,而后边就很快,这里有解释
> http://woodpecker.org.cn/diveintopython/file_handling/more_on_modules.html.

哪里有解释?你搞错了吧?

我猜是这样子的:直接运行第一次读取过的库文件会被缓存,下次从内存读取。而
py2exe 打包过的需要每次 zip 解压再读取。虽然 py2exe 生成的二进制文件也会
缓存,但是解压的结果不会。

风间星魂

unread,
May 6, 2013, 11:10:45 AM5/6/13
to pyth...@googlegroups.com
其实我在回帖中说的很清楚了。。还有,有疑问就去看pyexe源码。。。
明确的很。。

在 2013年5月6日星期一,依云 写道:
--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out




--
发自移动版 Gmail

xuxiaoyuan

unread,
May 8, 2013, 1:21:43 AM5/8/13
to pyth...@googlegroups.com
再顶一下,这个问题就没有一个靠谱的解决方案吗?

机械唯物主义 : linjunhalida

unread,
May 8, 2013, 1:39:51 AM5/8/13
to pyth...@googlegroups.com
当然有。

用upx压缩一下,速度可以提升一倍。

用一个C写的快速开启的splash exe,然后再慢慢执行你的python exe。

2013/5/8 xuxiaoyuan <awesome...@gmail.com>
再顶一下,这个问题就没有一个靠谱的解决方案吗?




--
GuruDigger- We help internet products find technical partners who share the same dream!

- http://gurudigger.com

风间星魂

unread,
May 8, 2013, 1:58:13 AM5/8/13
to pyth...@googlegroups.com
最好的办法就是不打包。
或者打包了在把exe和lib解开。
反正又不能保密什么。。


--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 



--

jamiesun

unread,
May 23, 2013, 2:40:49 PM5/23/13
to python-cn
我是了你的方法,使用你的二进制包,但是发现加载动态链接库的错误

我用了win32api的一些pyd


Reply all
Reply to author
Forward
0 new messages