如何提高这段简单的Python代码的性能?
使用re.search
查找匹配行难道不是最好的方法吗?因为它比Perl慢近6倍,或者我做错了什么吗?
#!/usr/bin/env python
import re
import time
import sys
i=0
j=0
time1=time.time()
base_register =r'DramBaseAddress\d+'
for line in open('rndcfg.cfg'):
i+=1
if(re.search(base_register, line)):
j+=1
time2=time.time()
print (i,j)
print (time2-time1)
print (sys.version)
这段代码完成的时间大约为0.96秒(10次运行的平均值)
输出结果:
168197 2688
0.8597519397735596
3.3.2 (default, Sep 24 2013, 15:14:17)
[GCC 4.1.1]
以下 Perl 代码可以在 0.15 秒内完成此操作。
#!/usr/bin/env perl
use strict;
use warnings;
use Time::HiRes qw(time);
my $i=0;my $j=0;
my $time1=time;
open(my $fp, 'rndcfg.cfg');
while(<$fp>)
{
$i++;
if(/DramBaseAddress\d+/)
{
$j++;
}
}
close($fp);
my $time2=time;
printf("%d,%d\n",$i,$j);
printf("%f\n",$time2-$time1);
printf("%s\n",$]);
输出:
168197,2688
0.135579
5.012001
编辑:修正了正则表达式——这会稍微降低性能
re.compile
的注释,您会看到:“最近传递给re.compile()
和模块级匹配函数的模式的编译版本被缓存,因此一次只使用少量正则表达式的程序无需担心编译正则表达式。” - Matthias