[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Größte Schnittmenge von mehreren Dateien



On Sun, 07 Aug 2005 20:06:43 +0200, Eduard Bloch <edi@gmx.de> wrote:

[...]

Args. Das war die letzte ungetestete Version. Die andere genannte
Alternative tut, was sie soll:

perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} > $a' a.txt b.txt c.txt
3
1

Interessant, wieder was gelernt und zugegebenermaßen ist es wirklich kurz. Du hattest ja weiter oben die Python-Variante mit "langsamer" in Verbindung gebracht ;-), also schaun wir mal ...

seq 2000000 | split -l 200000cat inter.py
from sys import argv, stdout
from sets import Set
gen = (Set(file(f)) for f in argv[1:])
inter = reduce(lambda x,y: x & y, gen)
stdout.writelines(inter)
time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} > $a' xa* > /dev/null
real    0m9.663s
user    0m8.669s
sys     0m0.725s
time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} > $a' xa* > /dev/null
real    0m9.620s
user    0m8.661s
sys     0m0.712s
time python2.4 inter.py xa* > /dev/null
real    0m4.914s
user    0m4.284s
sys     0m0.495s
tschwarz@schleppa:~/tmp
time python2.4 inter.py xa* > /dev/null
real    0m4.871s
user    0m4.294s
sys     0m0.486s

Nun ja, ist ja nicht wirklich verwunderlich, da ja bei den beiden verschiedenen Algorithmen die Leere Menge "klar im Vorteil ist". Also sind wir mal nicht so und probieren folgendes: 10 Files wobei je zwei aufeinanderfolgende Files zu 90% gleich sind:

for n in `seq 0 9`; do seq ${n}0000 1${n}0000 > x$n.txt; done
time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} > $a' x*.txt | wc
  10001   10001   60007
real    0m3.373s
user    0m3.126s
sys     0m0.119s
time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} > $a' x*.txt | wc
  10001   10001   60007
real    0m3.315s
user    0m3.120s
sys     0m0.128s
time python2.4 inter.py x*.txt | wc
  10001   10001   60007
real    0m4.346s
user    0m3.819s
sys     0m0.432s
time python2.4 inter.py x*.txt | wc
  10001   10001   60007
real    0m4.332s
user    0m3.797s
sys     0m0.444s

Also wenn Du mich fragst, ist die Python-Variante gar nicht so langsam und skaliert mit steigender Zahl von Files immer besser. Ist aber auch kein Wunder, da der Algorithmus ja auch anders ist.

Viele Grüße,

    Tilo



Reply to: