Самый быстрый способ конвертации списка кортежей в список именованных кортежей и обратно
Коллеги, дан список кортежей, надо перегнать его в список именованных кортежей. И наоборот.
Метод, который предлагает документация:
from collections import namedtuple
Nt = namedtuple('Nt', 'field1 field2 field3')
tuple_list = [(1,2,3), (4,5,6), (7,8,9)]
named_tuple_list = list(map(Nt._make, tuple_list))
Пробовал через генератор:
named_tuple_list = [Nt(*t) for t in tuple_list]
Померил время - официальный вариант быстрее.
С обратной конвертацией та же история.
new_tuple_list = [tuple(t) for t in named_tuple_list]
new_tuple_list = list((map(tuple, named_tuple_list)))
map работает быстрее чем генератор (спасибо @Danis).
Вопрос: map - это оптимальный способ с точки зрения скорости исполнения кода?
Ответы (1 шт):
От нечего делать решил сравнить оба метода, которые вы предлагаете. Выбирал руками без всякой автоматизации, но, возможно, попробую написать что-то для отслеживания и сбора данных.
Изначально вы предлагали два варианта:
- Вариант со списковым включением
- Вариант с list + map
Я подумал и добавил ещё два варианта. От ваших они практически не отличаются. За тем исключением, что tuple_list - это кортеж
Сделал это из того соображения, что кортеж занимает меньше места, чем лист. Может быть, это сыграет роль
Пример:
a = [1]
b = (1)
print(a.__sizeof__()) # 48
print(b.__sizeof__()) # 28
Каждый скрипт запускался обособленно от других. Запускал я 5 раз и результат получился следующий:
Код, которым я тестировал:
from collections import namedtuple
import time
start = time.time()
for i in range(5000):
Nt = namedtuple('Nt', 'field1 field2 field3')
tuple_list = ((1,2,3), (4,5,6), (7,8,9))
named_tuple_list = [Nt(*t) for t in tuple_list]
end = time.time() - start
print('Время выполнения списковое включение + (кортеж) - ', end)
# ---------------------------------------------
start = time.time()
for i in range(5000):
Nt = namedtuple('Nt', 'field1 field2 field3')
tuple_list = [(1,2,3), (4,5,6), (7,8,9)]
named_tuple_list = [Nt(*t) for t in tuple_list]
end = time.time() - start
print('Время выполнения списковое включение - ', end)
# ---------------------------------------------
start = time.time()
for i in range(5000):
Nt = namedtuple('Nt', 'field1 field2 field3')
tuple_list = [(1,2,3), (4,5,6), (7,8,9)]
named_tuple_list = list(map(Nt._make, tuple_list))
end = time.time() - start
print('Время выполнения list + map - ', end)
# ------------------------------------------
start = time.time()
for i in range(5000):
Nt = namedtuple('Nt', 'field1 field2 field3')
tuple_list = ((1,2,3), (4,5,6), (7,8,9))
named_tuple_list = list(map(Nt._make, tuple_list))
end = time.time() - start
print('Время выполнения list + map + кортеж - ', end)
