OVH Cloud OVH Cloud

comptage de caracteres specifique dans une chaine

22 réponses
Avatar
Eric Deveaud
bonjour,

je dispose de chaines de plusieur centaines de milliers de caracteres
parmis les caracteres de ces chaines certains sont des caracteres de padding
(un seul par type de chaine, généralement c'est le caractere *)

je dois à partir des chaines avec padding sortir les données suivantes

1) une liste des positions (indice) ou apparaissent ces caracteres de padding

2) une liste de la taille de la chaine d'origine avec comme valeur pour chaque
position le nombre de caracteres de padding rencontrés jsuqu'a cette position
incluse

exemple: sur une chaine de 15 de long

0 10 20
| |
padded_seq = "aaaaaa*aaaa*aaa"
^ ^
| |
6 11

je veux obtenir
padding_pos --> [6, 11]
padding_count --> [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]


pour ce faire j'ai commis les bouts de code suivants


Option 1 je découpe en 2 taches individuelles

#determination des positions des caracteres de padding
def get_padding_pos(padded_str, padding_mark='*'):
res = []
start = 0
p = padded_str.find(padding_mark, start)
while p != -1:
res.append(p)
p = padded_str.find(padding_mark, start)
return res

# determination de la liste du nombre de padding_mark precedent une position
def get_padding_count(padded_str, padding_mark='*'):
padding_count = []
n = 0
start = 0
for end in padding_pos:
padding_count += [n]*(end-start)
start = end
n+=1

padding_count += [n]*(len(padded_seq)-start)

option 2 je fais les 2 d'un coup

def get_padded_spec(padded_seq, padding_mark='*'):
i = n = 0
stop = len(padded_seq)
padding_pos = []
padding_count = []
while i < stop:
if padded_seq[i] == padding_mark:
padding_pos.append(i)
n += 1
padding_count.append(n)
i += 1
return padding_pos, padding_count
je trouve ça très lourd comme traitement surtout sur des chaines de plusieurs
centaines de milliers de caracteres, avez vous mieux à me proposer ??

pour le momment je travaille sur des listes, je vais passer en array très
prochainement, y gagnerais-je en temps d'exécution (je sais j'ai qu'a mesurer)

Eric
--
- mais ce netbsd, c'est un linux ou pas ??
- NON ! C'est un Unix ! C'est un Unix-based et Linux est un Unix-like
- ok c bien ce ke je me disait, bon alors je recherche toujours un LINUX
-+- Dragondir in Guide du BSDiste pervers -+- Vous avez dit Nulix ? -+-

2 réponses

1 2 3
Avatar
Méta-MCI
En pratique, moins il y a de marques, plus ça va vite...
Avatar
Eric Deveaud
Eric Deveaud wrote:

PS je vais mesurer les temps d'execution des différentes approches et vous
tiendrais au courant.



au final apres quelques mesures.

la méthode da génération de la liste des positions de padding proposée par
Michel, à base de plit est la plus rapide
la méthode de comptage du nomre de caracthres de padding précidant une position
donné que je propose est la plus rapide
je vais donc combiner les 2

j'obtiens ceci

hebus:Work/projet_attelles > python padding_bench.py
36801 marks over 1000000 characters

determination de la liste des position des caracteres de padding
test 1 0.444808, (bibi)
test 2 0.453707, (Gerard Flanagan)
test 3 0.539496, (Philipe Bouige)
test 4 0.114206, (Michel Claveau)
liste de comptage des caracteres de padding precedant une position n
test 5 0.190960, (bibi)
test 6 0.221079, (Gerard Flanagan)
test 7 0.345876, (Michel Claveau)
test 8 0.536432, (bibi sur une idee de Michel Claveau)

le code des bench est disponibles ici
<URL:http://edeveaud.free.fr/tmp/padding_bench.py>


merci a tous ;-)

Eric


--
Enfin, quelqu'un de sensé.
(Ca ne me regarde pas, pas je tenais à souligner ce point)
-+- RS in GNU Quand on a rien à dire, il importe de le faire savoir -+-

1 2 3