Tein nyt testin vielä siten että pilkoin tuon tiedoston riveiksi, mutta yllättäen lopputulos ei muuttunut juuri ollenkaan, Python on edelleen n. 7 kertaa hitaampi kuin Perl, eli 3,5s vs. 0,5s.
Muokkaus: Tajusin juuri että tein tuon regexpin hieman hölmösti tuossa Python koodissa, eli tein re.findall(m, line) kun olisin voinut tehdä m.findall(line). Korjasin tuon nyt tuohon koodiin, mutta Python koodi ei nopeutunut kuin ehkä 0,05s, ja tuokin on niin pieni ero että on vaikea sanoa onko se sattumaa vai oikeaa nopeutumista.
Muokkaus2: Huomasin juuri että jos tuosta regexpistä jättää nuo sulkeet pois niin Python versio nopeutuu jonkin verran, ero on enää 2s vs. 0,5s Perlin hyväksi. Tein muutoksen allaoleviin koodipätkiin.
Tässä ohjelma joka generoi tiedoston:
#!/usr/bin/env python3
from random import randint, choice
from string import ascii_uppercase, ascii_lowercase
def sosnum():
return "%02d%02d%02d-%03d%s" % (
randint(1,30),
randint(1,12),
randint(0,99),
randint(1,600),
choice(ascii_uppercase+"0123456789"))
for i in range(1,100000):
if (i % 10 == 0):
print()
for j in range(1,randint(100,1000)):
print(choice(ascii_lowercase), end="")
print(sosnum(), end="")
Tässä Python lukija:
#!/usr/bin/env python3
from sys import stdin
import re
m = re.compile('[0-9]{6}-[0-9]{3}[A-Z0-9]')
result = []
for line in stdin:
result += m.findall(line)
print(len(result))
print(result[0:10])
Ja tässä Perl lukija:
#!/usr/bin/env perl
my @found = ();
my @match;
while(<STDIN>) {
@match = $_ =~ m/[0-9]{6}-[0-9]{3}[A-Z0-9]/g;
push(@found, @match);
}
print @found . "\n";
my @first = @found[0..9];
print "['";
print join("', '", @first);
print "']\n";