J'avais 5 mn à perdre, et je voulais voir les résultats 🙂
Déjà, le bash ne sera jamais plus rapide que python pour traiter bcp de données.
Ton script bash n'est pas optimisé (le python non plus d'ailleurs !)
Pour créer 2 fichiers de password de 1000 lignes
for ((i=1;i<1000;i++))
do
md=$(printf '%0*d' 32 $i)
echo "utilisateur$i:$md" >> ./data1
echo "$md:pass$i" >> ./data2
done
Ma version bash (je pense qu'on peut faire mieux 😉)
#/bin/bash
fpass=$(< ./data2)
while read ligne
do
name=${ligne%:*}
md=${ligne#*:}
li=$(grep $md <<< "$fpass")
echo $name:${li#*:} >> ./data3
done < ./data1
exit
$ time ./test.sh
real 0m30.146s
user 0m29.270s
sys 0m4.492s
J'ai abandonné avec ton bash après plus d' 1 mn ....
Le script python (je pense qu'on peut faire mieux, j'ai pas non plus cherché 😉).
#!/usr/bin/python
# -*- coding:utf-8 -*-
fd1 = open('data1','r')
fd2 = open('data2','r')
fd3 = open('data3','w')
for line in fd1:
user, md = line.rstrip().split(':')
for line2 in fd2:
md1, password = line2.rstrip().split(':')
if md == md1:
fd3.write('%s:%s\n' % (user, password) )
break
fd1.close()
fd2.close()
fd3.close()
$ time ./test.py
real 0m0.033s
user 0m0.020s
sys 0m0.012s
$ time ./test.py
real 0m0.035s
user 0m0.024s
sys 0m0.012s
$ time ./test.py
real 0m0.033s
user 0m0.028s
sys 0m0.004s
Avec ton script python:
$ time ./test.py
real 0m0.897s
user 0m0.828s
sys 0m0.020s
$ time ./test.py
real 0m0.870s
user 0m0.828s
sys 0m0.016s
$ time ./test.py
real 0m0.872s
user 0m0.844s
sys 0m0.028s
PS: J'ai essayer avec l'otion -m de grep ou avec sed
li=$(sed -n "/$md/p;q" <<< "$fpass")
Le résultat est un peu prêt pareil, cela varie entre 28 et 30s