Thursday, January 1, 2009

Python2.5和python3.0性能循环测试

测试环境 Ubuntu 8.04 linux 2.6.24-23-386 i686 GNU/Linux

运行环境 python2.5/python3.0

分析命令:Top

测试结果分析:
分界线上段代码的用的无限循环。然后到某个值后跳出
1,2分别为python2.5,python3.0的执行环境
分界线下段代码的用的是遍历range
3,4分别为python2.5,python3.0的执行环境

先分析Python2.5
1,3 做横向比较, 1的CPU的消耗略小于2,而内存消耗明显高于2。
原因很简单:1 中 对i做累加,所以略占用计算资源。而2则是在内存中实现一组长序列(请原谅我未曾深入python C源码学习,range实现的数据结构我不了解)显然内存空间被大量占用。

再分析python3.0
2,4做横向比较, 内存消耗相差不大。因为python3.0中的range实质是从List->Iterator.但是CPU消耗是很大的。这个我们最后总结。

纵向比较1,2和3,4, 1的各方面都优于2。而3,4分别优于CPU和内存。

总结: python3.0 对 python2.5的数据结构做了很大改进(这里我们谈实现性能)。总体方向是很成功的。问题是,细节上,需要优化的地方太多太多,就像Guido之前所说。而至于python3.0 在实现上的改进的所有内容,请参见python.org.

就目前主流的 python2.5而言。把range作为循环的容器显然是很消耗资源的行为。
所以以后就该有个好习惯,如果循环序列很大,那么就用while做为一个好习惯。

虽然我们常说空间换时间,但在这种情况下,无非舍本逐末。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

#-------------------------------------------
# Designer : free.Won
# Licence : License on GPL Licence
# Archieved : Jan 1st 2009
#-------------------------------------------

import threading

class Multirun(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
i=1
while 1:
if i== 10**7:
break
print(i)
i+=1

if __name__ == '__main__':
tset = []
for i in range(10000):
t = Multirun()
tset.append(t)
for one in tset:
one.start()
one.join()
1.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17305 freefis 20 0 23152 12m 1524 S 10.3 0.7 0:03.36 python

2.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17451 freefis 20 0 29836 18m 1720 S 28.0 1.0 0:08.92 python3.0


===========================================

#!/usr/bin/python3.0
#-*- coding:utf-8 -*-

#-------------------------------------------
# Designer : free.Won
# Licence : License on GPL Licence
# Archieved : Jan 1st 2009
#-------------------------------------------

import threading

class Multirun(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
for i in range(10**7):
print(i)

if __name__ == '__main__':
tset = []
for i in range(10000):
t = Multirun()
tset.append(t)
for one in tset:
one.start()
one.join()

3
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17389 freefis 20 0 176m 166m 1524 S 9.0 8.8 0:02.76 python

4
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17494 freefis 20 0 29836 18m 1720 S 47.9 1.0 0:10.46 python3.0

Followers