Contents
Py vs Perl 运行
{{{俊杰蔡 <yzcaijunjie@gmail.com> reply-to python-cn@googlegroups.com, to python-cn@googlegroups.com, date Thu, Apr 3, 2008 at 5:50 PM subject [CPyUG:45860] }}} 一段python程序的效率问题
- 从以下对比得出
- (a)random.random()函数比random.randrange()函数快。
- (b)xrange不一定比range快。
- (c)使用StringIO缓存全部内容,一下子写也不一定快。
- (d)write() 块写效率会提高。
- (e)print 到文件句柄 写效率也不错高
- (f)脚本越短,引用的模块越少效率好
ZoomQuiet 测试环境:
- HP 520 笔记本电脑 (GQ349AA)
- 英特尔® 酷睿™ 双核处理器 T2300E 1.66GHz , 2MB 二级高速缓存, 667MHz FSB
- 内存 2Gb
time vs 0.1
5" random.pl
use strict; open (WW,"> 500000") or die "$!"; foreach(1..5000000){ my $i = int(rand 10000000) % 3; print WW $i."\n"; } close WW;
31" random.py
time vs 0.2
48" random0.2.py
Toggle line numbers
1 import cStringIO as StringIO
2
3 import random
4 import time
5
6 __revision__ = '0.2'
7
8 def test():
9 fh = open("test_cjj0.2","w")
10 output = StringIO.StringIO()
11
12 for i in xrange(5000000):
13
14 data = random.randrange(1000000,9999999,1)
15 yu = data % 3
16 print >>output, yu
17
18 fh.write(output.getvalue())
19
20 fh.close()
21
22 if __name__ == "__main__" :
23 test()
time vs 0.3
33" random0.3.py
time vs 0.4
27" random0.4.py
time vs 0.5
51" random0.5.py
Toggle line numbers
1 import cStringIO as StringIO
2 import random
3 __revision__ = '0.5'
4
5 #fn = open("test_cjj0.4","w")
6 out = StringIO.StringIO()
7 for i in xrange(5000000):
8 data = random.randrange(1000000,9999999,1)
9 print >> out, (data % 3)
10
11 open("test_cjj0.5","w").write(out.getvalue())
time vs 0.6
26" random0.6.py
time vs 0.7
10" random0.7.py
time vs 0.8
5" random0.8.py
Toggle line numbers
1 from random import random
2
3 __revision__ = '0.8'
4
5 def test():
6 fh = open("test_cjj0.8","w")
7 for i in range(5000000):
8 print >> fh,(int(random()*(9999999-1000000)+1000000))% 3
9
10 if __name__ == "__main__" :
11 try:
12 import psyco
13 psyco.full()
14 except ImportError:
15 pass
16 test()
time vs 0.9
- 使用 pysco 前后的差异
15~11" random0.9.py
Toggle line numbers
1 from random import random
2 __revision__ = '0.9'
3
4 def test():
5 five_million = 5000000
6 fh = open("test_cjj0.9","w")
7 for i in xrange(five_million):
8 data = int(random()*(9999999))
9 yu = data % 3
10 fh.write('%d\n' % yu)
11 fh.close()
12
13 if __name__ == "__main__" :
14 try:
15 import psyco
16 psyco.full()
17 except ImportError:
18 pass
19 test()
time vs 1.0
- 是否打开 pysco 的对比
- 使用迭代后,进行 pysco 加速反而无益
9~10" random1.0.py
__revision__ = '1.0' def gen_yu(): for i in xrange(5000000): data = int(random()*(9999999)) yu = data % 3 yield yu def test(): fh = open("test_cjj1.0","w") content = '\n'.join([str(m) for m in gen_yu()]) fh.write(content) fh.close() if __name__ == "__main__" : #''' try: import psyco psyco.full() except ImportError: pass #''' test()
time vs end
{{{俊杰蔡 <yzcaijunjie@gmail.com> reply-to python-cn@googlegroups.com, to python-cn@googlegroups.com, date Sat, Apr 5, 2008 at 2:03 AM subject [CPyUG:45963] Re: 一段python程序的效率问题 }}} Python 脚本胶水威力!
1" a.py
cjj.c:
#include <stdio.h> void amaze() { FILE *fp; int i,num; fp = fopen("test_cjj","w"); for(i=0;i<5000000;i++) { num = (rand()%9000000+1000000) % 3; fprintf(fp,"%d\n",num); } fclose(fp); }
cjj.i:
%module cjj %{ extern void amaze(); %} extern void amaze();
编译
swig -python cjj.i \ gcc -c cjj.c cjj_wrap.c -I/usr/include/python2.5 \ ld -shared cjj.o cjj_wrap.o -o _cjj.so
a.py:
运行
$time ./a.py real 0m1.271s user 0m1.228s sys 0m0.036s
反馈
创建 by -- ZoomQuiet [2008-04-03 13:26:48]