Как повысить производительность этого простого фрагмента кода на Python? Это не re.search
лучший способ найти подходящую линию, так как она почти ~ 6x медленнее, чем Perl, или я делаю что-то неправильно?Улучшение производительности кода Python
#!/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
EDIT: Исправленная регулярное выражение - Какие ухудшили показатели незначительно
Вы должны предварительно скомпилировать регулярное выражение, если вы используете его несколько раз, или в этом случае используйте 'in' вместо:' if base_register in line: '. –
Если вы прочитали примечание к ['re.compile'] (https://docs.python.org/3/library/re.html#re.compile), вы увидите:« Скомпилированные версии последних шаблоны, переданные в re.compile(), и функции сопоставления на уровне модуля кэшируются, поэтому программы, которые используют только несколько регулярных выражений одновременно, не должны беспокоиться о компиляции регулярных выражений ». – Matthias