У меня есть структура данных, которая состоит из фиксированного числа полей и рекурсивной функции, которая выполняет некоторую обработку списка этих структур. На каждой итерации функция обращается к какому-то конкретному элементу списка (структуре данных), анализирует все его поля и (на основе значений полей) изменяет список, удаляя или добавляя новые элементы структуры данных.
Мне было интересно, что будет наиболее эффективным способом реализации этой структуры данных? Я предполагаю, что наиболее чувствительными аспектами являются создание новой структуры и доступ к полям структуры. Я провел некоторое тестирование на структурах с 10 полями:
- Реализация в виде списка:
print("List")
def list_f ():
l = [1,2,3,4,5,6,7,8,9,10]
a1 = l[0]
a2 = l[1]
a3 = l[2]
a4 = l[3]
a5 = l[4]
a6 = l[5]
a7 = l[6]
a8 = l[7]
a9 = l[8]
a10 = l[9]
print(timeit("list_f()", "from __main__ import list_f"))
Вывод:
List
0.4056466743350029
Реализовать как диктовку:
print("Dict")
def dict_f ():
d = {"1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "10":10}
a1 = d["1"]
a2 = d["2"]
a3 = d["3"]
a4 = d["4"]
a5 = d["5"]
a6 = d["6"]
a7 = d["7"]
a8 = d["8"]
a9 = d["9"]
a10 = d["10"]
print(timeit("dict_f()", "from __main__ import dict_f"))
Вывод:
Dict
0.6061008963733912
Реализация как класс:
print("Class")
class C (object):
def __init__(self, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10):
self.a1 = a1
self.a2 = a2
self.a3 = a3
self.a4 = a4
self.a5 = a5
self.a6 = a6
self.a7 = a7
self.a8 = a8
self.a9 = a9
self.a10 = a10
def class_f ():
c = C(1,2,3,4,5,6,7,8,9,10)
a1 = c.a1
a2 = c.a2
a3 = c.a3
a4 = c.a4
a5 = c.a5
a6 = c.a6
a7 = c.a7
a8 = c.a8
a9 = c.a9
a10 = c.a10
print(timeit("class_f()", "from __main__ import class_f, C"))
Вывод:
Class
1.2926895800046623
Мне кажется, списки являются наиболее эффективным решением. Знаете ли вы о какой-либо другой реализации, которую я мог бы попробовать, или как эти времена выполнения могли зависеть от количества и типа полей структуры?
РЕДАКТИРОВАТЬ:
Так же, как пояснение, поля не имеют тот же тип (я только что использовал все int-ы в примере), будут некоторые строки, некоторые дескрипторы объектов и так далее ... Мне никогда не придется изменять поля на лету. Я знаю, какие значения я хочу, чтобы они имели при создании структуры, поэтому я инициализирую их и вставляю структуру в список. Функция только считывает эти значения и удаляет всю структуру из списка по окончании (и при необходимости создает совершенно новую структуру и вставляет ее в список ввода). Я тот, кто определяет и структуру, и функцию, чтобы я мог адаптировать функцию для эффективной работы с любой реализацией.