2010-01-16 5 views
0

Je cherche à voir si ce code peut être optimisé.Python: Aidez-moi à optimiser ce code.

def gB(a,b,c): 
    x=len(b) 
    d=a.find(b)+x 
    e=a.find(c,d) 
    return a[d:e] 

print gB("abc","a","c") 
+1

Que signifie "gb"? –

+2

Que voulez-vous dire par optimiser? Vous n'avez aucune vérification d'erreur. En outre, donnez un exemple réaliste avec la sortie s'il vous plaît. Qu'essayez-vous de faire? –

+5

Je commencerais à optimiser ceci en le rendant lisibles aux autres. –

Répondre

4

Il y a quelques problèmes avec votre code que vous devriez probablement corriger avant d'essayer de l'optimiser.

Tout d'abord, il n'est pas documenté et la dénomination n'est pas utile. Je suppose qu'il essaie d'extraire une chaîne entre les marqueurs de début et de fin.

En second lieu, il donne une correspondance apparente même si le début et/ou des marqueurs de fin ne sont pas trouvés:

>>> print gB("abc", "d", "e") 
ab 

Il serait préférable de soulever une exception ou retour Aucun dans ce cas. En ce qui concerne la vitesse, je doute que vous puissiez obtenir plus rapidement pour trouver des cordes que d'utiliser les fonctions de recherche de cordes intégrées. Ils sont écrits en C et ont sans doute passé beaucoup de temps à les optimiser. Si quelqu'un peut implémenter la recherche de chaîne plus rapidement en Python, alors les personnes qui ont écrit trouver doivent revenir en arrière et regarder leur code à nouveau.

1

Que pensez-vous de cela?

import re 

def gB(a, b, c): 
    return (re.findall('%s(.*?)%s' % (b, c), a) or [''])[0] 

Si vous parlez d'un code plus petit, je pense que le module re peut vous aider.

+0

Vous devez redéfinir b et c si cela va fonctionner pour b = '.' par exemple. –

+0

Je ne pense pas que vous voudriez utiliser 'findall()', seulement pour rejeter tout sauf le premier match. –