У меня есть огромный кортеж строк, которые возвращаются из программы. В качестве примера кортежа возвращается может выглядеть следующим образом:Самый быстрый способ конвертировать '(-1,0)' в кортеж (-1, 0)?
('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)')
I может преобразовать эти строки в реальные кортежи (с целыми числами внутри), но я надеюсь, кто-нибудь знает хороший трюк, чтобы ускорить этот процесс. Все, что я придумал, похоже на то, что я делаю это относительно медленно. И, как я уже упоминал, эти списки могут быть большими, поэтому быстрый способ будет высоко оценен!
Благодаря
редактировать один Хорошо, так что его кажущаяся, что Eval более медленный способ сделать это. Но пока у меня есть 4 проверенных метода, спасибо за любые комментарии и комментарии! :)
Кроме того, кто-то спросил о размере моих кортежей. Он будет варьироваться от нескольких, и, надеюсь, не более нескольких миллионов. Не «слишком» большой, но достаточно большой, чтобы скорость была важным фактором. Я здесь не для микро-оптимизации, просто изучаю любые новые отличные трюки, о которых я, возможно, и не подозревал. Например, eval() - это то, о чем я часто забываю, хотя в этом случае это не так хорошо.
редактировать две Я также хотел бы отметить, что формат строки не должно изменяться. Поэтому нет необходимости проверять формат. Кроме того, это встроенный Python v2.6.2, поэтому ничего , требующее 2.6, в порядке. 3,0 с другой стороны, не так много;)
Глядя отличные ребята, опять же, спасибо за вход :)
редактировать 3 Еще одно замечание. Я заметил, что я возвращал код, который не приводил к «кортежу», это нормально, и жаль, если кто-то думал, что конечный результат «имел» быть кортежем. Что-то вроде формата прекрасно.
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)
Результаты в:
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
Итак, что вы сделали, и почему вы думаете, что это медленно? –
Я отправляю свои тесты за секунду. Я также буду обновлять его любыми другими идеями, но до сих пор я не знаю, что у меня медленный, но я надеялся, что может быть какой-то отличный трюк. Python часто вытаскивает рати из шляпы, поэтому я всегда пытаюсь изучить новые пути :) –
Поскольку длина входного кортежа строк, по-видимому, является фактором, измените вашу строку назначения test_tuple на 'test_tuple = ('(-1,0)', и т.д., и т.д.). * 100'. – PaulMcG