## page was renamed from MicroProj/2008-04-03 ##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> ##startInc = Py vs Perl 运行 = {{{俊杰蔡 reply-to python-cn@googlegroups.com, to python-cn@googlegroups.com, date Thu, Apr 3, 2008 at 5:50 PM subject [CPyUG:45860] }}} [[http://groups.google.com/group/python-cn/browse_thread/thread/4e4eb6d67a867c21/8b346859a4c96e29#8b346859a4c96e29|一段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 == {{attachment:vs-0.1.png}} === 5" random.pl === {{{ #!/usr/bin/perl -w 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 === {{{#!python import random import time __revision__ = '0.1' def test(): fh = open("test_cjj","w") for i in range(5000000): data = random.randrange(1000000,9999999,1) yu = data % 3 fh.write(str(yu)+"\n") fh.close() if __name__ == "__main__" : test() }}} == time vs 0.2 == {{attachment:vs-0.2.png}} === 48" random0.2.py === {{{#!python import cStringIO as StringIO import random import time __revision__ = '0.2' def test(): fh = open("test_cjj0.2","w") output = StringIO.StringIO() for i in xrange(5000000): data = random.randrange(1000000,9999999,1) yu = data % 3 print >>output, yu fh.write(output.getvalue()) fh.close() if __name__ == "__main__" : test() }}} == time vs 0.3 == {{attachment:vs-0.3.png}} === 33" random0.3.py === {{{#!python import random import time __revision__ = '0.3' def test(): exp = "" for i in xrange(5000000): data = random.randrange(1000000,9999999,1) exp += "%s\n"%(str(data % 3)) open("test_cjj0.3","w").write(exp) if __name__ == "__main__" : test() }}} == time vs 0.4 == {{attachment:vs-0.4.png}} === 27" random0.4.py === {{{#!python import random __revision__ = '0.4' fn = open("test_cjj0.4","w") for i in xrange(5000000): data = random.randrange(1000000,9999999,1) print >> fn, (data % 3) }}} == time vs 0.5 == {{attachment:vs-0.5.png}} === 51" random0.5.py === {{{#!python import cStringIO as StringIO import random __revision__ = '0.5' #fn = open("test_cjj0.4","w") out = StringIO.StringIO() for i in xrange(5000000): data = random.randrange(1000000,9999999,1) print >> out, (data % 3) open("test_cjj0.5","w").write(out.getvalue()) }}} == time vs 0.6 == {{attachment:vs-0.6.png}} === 26" random0.6.py === {{{#!python import random __revision__ = '0.6' fn = open("test_cjj0.6","w") for i in xrange(5000000): print >> fn, (random.randrange(1000000,9999999,1))% 3 }}} == time vs 0.7 == {{attachment:vs-0.7.png}} === 10" random0.7.py === {{{#!python from random import random __revision__ = '0.7' fh = open("test_cjj0.7","w") for i in range(5000000): print >> fh,(int(random()*(9999999-1000000)+1000000))% 3 }}} == time vs 0.8 == {{attachment:vs-0.8.png}} === 5" random0.8.py === {{{#!python from random import random __revision__ = '0.8' def test(): fh = open("test_cjj0.8","w") for i in range(5000000): print >> fh,(int(random()*(9999999-1000000)+1000000))% 3 if __name__ == "__main__" : try: import psyco psyco.full() except ImportError: pass test() }}} == time vs 0.9 == {{attachment:vs-0.9.png}} * 使用 pysco 前后的差异 === 15~11" random0.9.py === {{{#!python from random import random __revision__ = '0.9' def test(): five_million = 5000000 fh = open("test_cjj0.9","w") for i in xrange(five_million): data = int(random()*(9999999)) yu = data % 3 fh.write('%d\n' % yu) fh.close() if __name__ == "__main__" : try: import psyco psyco.full() except ImportError: pass test() }}} == time vs 1.0 == {{attachment:vs-1.0.png}} * 是否打开 pysco 的对比 * 使用迭代后,进行 pysco 加速反而无益 === 9~10" random1.0.py === {{{#!pythonfrom random import random __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 == {{{俊杰蔡 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:{{{#!cpp #include 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:{{{#!python import cjj __revision__ = '0.1' if __name__ == "__main__" : try: import psyco psyco.full() except ImportError: pass cjj.amaze() }}} 运行{{{ $time ./a.py real 0m1.271s user 0m1.228s sys 0m0.036s }}} ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]