作者Freak1033 (金が信念! XD)
看板Python
标题Re: [问题] python 的速度
时间Sat Feb 18 05:09:07 2006
※ 引述《yoco315 (眠月)》之铭言:
: ※ 引述《Jobaba (下雨了)》之铭言:
: : 感觉时间差好多喔..
: : 不知道大家觉得为何会差那麽多呢...
: Python 本来就是这麽慢的
: 你看一下 Python 的 Extending and Embedding
: 看看 Python 底层是怎麽用 C 实作的
: http://docs.python.org/ext/ext.html
: 看完就知道会这麽慢是很正常的
其实还好... python 包变数包得的确很没有空间效率,
但是你是否有注意到大多数的 special member function 都在 type object
里面有独立的 entry? (也就是说它们的 binding 不需要 look up)
其实主要会慢还是慢在它的 VM 上面...
这边稍微提一下 python 的程式是怎麽执行的,
当一支 python module 被读进记忆体的时候,
它会先被 compile 成 bytecode, 也就是你在 .pyc 里面看见的东西,
而执行的时候则是用一台 virtual machine 一个一个指令读进来模拟,
而这是非常没有效率的.
你可能会想问那为什麽其他的 bytecode virtual machine 没有那麽慢,
比方说 java 或是 c# 都比 python 快上许多,
甚至 java 的执行效率直逼 native program?
那是因为它们有利用到 JIT(just-in-time compilation) 的技术,
每当执行到一段 bytecode 时, virtual machine 会先把它翻译成 native code 执行,
而当以後再执行到同一段 bytecode 时, 翻译的动作就可以省去.
python 内建是没有这样的机制的, 但我下一段会介绍一个替代品.
: 所以 Python 的效能关键部分才要用 C 写的 Module 包装起来
: 不然用直接在 Python 层次 codding 的话肯定会跑到哭
其实 python 写得有技巧的话也可以很有效率...
比方说如果你知道 python list 其实就是 array 的话,
你那就不会常常写 somelist.pop(0) 这样的东西出来.
至於 bytecode 跑得慢的问题, 其实是有解的:
http://psyco.sourceforge.net/
这支 python module 很有意思, 它所实作的就是 JIT 的功能,
而且它是可以手动调整 profiling 的,
你可以自由设定某些较常执行的 function 才 optimize.
---
另外一个我很看好的东西是这个:
http://codespeak.net/pypy/
这玩意儿将可能是下一代的 python interpreter,
它最大的特色就是它整只程式都是 python 写的, 完全脱去了跟其他语言的牵连.
但是这样会造成一个问题, 就是我们总得有一个 native 的 interpreter,
而 pypy 里面有个叫 translator 的 module,
它的功能是把 python 的程式转译成较低阶的语言,
比方说 C 或 LLVM 甚至是组语,
之後便可以再用别的 compiler 把它编译成 native code.
(LLVM 是一种适合 optimize 的语言, 主要用於 compiler 内部表示)
translator 有趣的地方在於虽然 python 是一个 weak typing 的语言,
然而事实上正常的 python 程式大多数变数都还是只会拥有单一型别,
它能够分析程式的 control flow 来进行 compile-time binding,
最後产生出来的 code 则有可能跟其他 strong typing 的语言同样有效率.
这玩意儿等到实用化了, 我恐怕真的会把精熟的 C++ 忘光完全倒向 python 吧.
--
その乾いた哀愁の瞳に去来するものは何か?
失ったもの 得たもの
そして广大なネットの狭间で彼が见たものとは?
虚像と实存と记号の中に彼は今、何を想うのか?
<バトルプログラマーシラセ>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.224.64
1F:推 Jobaba:感谢各位的回答, 我刚入新手, 还要多多看一些文件 :) 02/18 10:14
2F:→ Jobaba: 才是 02/18 10:18
3F:推 yoco315:好文章按个好 @@ 02/18 12:58
4F:推 wawawa:我本来以为python速度比java快说~.~看来是我搞错了 02/18 23:06
5F:→ wawawa:希望新一代的interpreter赶快诞生吧^_^ 02/18 23:07