J'ai un grand nombre de chaînes, qui sont renvoyées d'un programme. Un exemple tuple retourné pourrait ressembler à ceci:Le moyen le plus rapide de convertir '(-1,0)' en tuple (-1, 0)?
('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)')
Je peux convertir ces cordes à tuples réelles (avec des entiers à l'intérieur), mais j'espère que quelqu'un connaît une belle astuce pour accélérer ce. Tout ce que je suis venu avec se sent comme je le fais d'une manière relativement «lente». Et comme je l'ai mentionné, ces listes peuvent être grandes, donc un moyen rapide serait très apprécié!
Merci
modifier un Bon, son semblant que eval est une méthode plus lente de le faire. Mais jusqu'à présent, j'ai testé 4 méthodes, merci pour vos commentaires et soumissions! :)
Aussi, quelqu'un a demandé sur la taille de mes tuples. Il va varier de quelques-uns, pour ne pas dépasser quelques millions. Pas "trop" gros, mais assez gros pour que la vitesse soit un facteur important. Je ne suis pas ici pour micro-optimiser, juste apprendre de nouveaux trucs astucieux dont je ne suis pas au courant. Par exemple, eval() est quelque chose que je oublie souvent, même si cela ne semble pas très bien dans ce cas.
modifier deux Je voulais aussi noter que le format de la chaîne ne devrait pas changer. Donc pas besoin de vérifier le format. En outre, ceci est un Python v2.6.2 embarqué, donc n'importe quoi exigeant 2.6 est bien. 3.0 d'autre part, non pas tant;)
recherche grand gars, encore une fois, merci pour l'entrée :)
modifier 3 Encore une autre note. J'ai remarqué que j'avais retourné du code qui ne résultait pas en un "tuple", c'est correct, et désolé si quelqu'un pensait que le résultat final "devait" être un tuple. Quelque chose de format similaire est bien.
import timeit
test_tuple = ('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)', '(7,0)',)
def timeit_a():
''''''
def convert_tup_strings(tup_string):
first_int, last_int = tup_string[1:-1].split(',')
return (int(first_int), int(last_int))
return map(convert_tup_strings, test_tuple)
def timeit_a_1():
''''''
def convert_tup_strings(tup_string):
return map(int, tup_string[1:-1].split(','))
return map(convert_tup_strings, test_tuple)
def timeit_b():
converted = []
for tup_string in test_tuple:
first_int, last_int = tup_string[1:-1].split(',')
converted.append((int(first_int), int(last_int)))
return converted
def timeit_b_1():
converted = []
for tup_string in test_tuple:
converted.append(map(int, tup_string[1:-1].split(',')))
return converted
def timeit_c():
''''''
return [eval(t) for t in test_tuple]
def timeit_d():
''''''
return map(eval, test_tuple)
def timeit_e():
''''''
return map(lambda a: tuple(map(int, a[1:-1].split(','))), test_tuple)
print 'Timeit timeit_a: %s' % timeit.timeit(timeit_a)
print 'Timeit timeit_a_1: %s' % timeit.timeit(timeit_a_1)
print 'Timeit timeit_b: %s' % timeit.timeit(timeit_b)
print 'Timeit timeit_b_1: %s' % timeit.timeit(timeit_b_1)
print 'Timeit timeit_c: %s' % timeit.timeit(timeit_c)
print 'Timeit timeit_d: %s' % timeit.timeit(timeit_d)
print 'Timeit timeit_e: %s' % timeit.timeit(timeit_e)
Résultats dans:
Timeit timeit_a: 15.8954099772
Timeit timeit_a_1: 18.5484214589
Timeit timeit_b: 15.3137666465
Timeit timeit_b_1: 17.8405181116
Timeit timeit_c: 91.9587832802
Timeit timeit_d: 89.8858157489
Timeit timeit_e: 20.1564312947
Alors, qu'avez-vous fait, et pourquoi pensez-vous qu'il est lent? –
Je poste mes tests dans une seconde. Je vais aussi le mettre à jour avec d'autres idées, mais pour l'instant, je ne sais pas si le mien est lent, mais j'avais espéré qu'il y aurait un truc astucieux. Python tire souvent un rabit d'un chapeau, donc j'essaie toujours d'apprendre de nouvelles façons :) –
Puisque la longueur du tuple d'entrée de chaînes semble être un facteur, changez votre ligne d'affectation test_tuple à 'test_tuple = ('(-1,0)', etc., etc.) * 100'. – PaulMcG