Самый быстрый способ конвертации списка кортежей в список именованных кортежей и обратно

Рейтинг: 2Ответов: 1Опубликовано: 26.03.2023

Коллеги, дан список кортежей, надо перегнать его в список именованных кортежей. И наоборот.

Метод, который предлагает документация:

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)