(Python3) Что лучше: многократно обращаться к словарю или иметь ссылку на значение элемента? - PullRequest
0 голосов
/ 06 мая 2020

Так, например:

if(self._ConnectGenes[innov_num].is_enabled() and self._ConnectGenes[innov_num].is_computed()==False):
     self._NodeGenes[self._ConnectGenes[innov_num]._Out].value += self._NodeGenes[next] * self._ConnectGenes[innov_num]._Weight
     self._ConnectGenes[innov_num].set_computed(True)
     queue.append(self._ConnectGenes[innov_num]._Out) #Append the next skirt to the graph

Здесь у нас есть несколько обращений к словарю self._ConnectGenes, и элемент хранится под ключом self._ConnectGenes [Innov_num]

Я интересно, было бы лучше, если бы у нас была ссылка на этот элемент, например,

genome = self._ConnectGenes[innov_num]
if(genome.is_enabled() and genome.is_computed()==False):
     self._NodeGenes[genome._Out].value += self._NodeGenes[next] * genome._Weight
     genome.set_computed(True)
     queue.append(genome._Out) #Append the next skirt to the graph

Сэкономит ли это производительность? Поскольку этот фрагмент кода будет вызываться много раз.

Решение:

эксперимент:

import time

#----Preparation
access_dict = {"num":4}

#----Timing
start = time.time()
for i in range(100000000):
    access_dict["num"] = access_dict["num"] +1
end = time.time()
print("Dict access",end - start)

#----Timing
start = time.time()
for i in range(100000000):
    access_dict["num"] +=1
end = time.time()
print("Dict access2",end - start)

#----Timing
start = time.time()
ref = access_dict["num"]
for i in range(100000000):
    ref = ref +1
end = time.time()
print("Ref access",end - start)


#----Timing
start = time.time()
ref = access_dict["num"]
for i in range(100000000):
    ref += 1
end = time.time()
print("Ref access2",end - start)

Вывод:

Dict access 7.079166889190674
Dict access2 6.49668288230896
Ref access 5.318424224853516
Ref access2 5.393644332885742

1 Ответ

1 голос
/ 06 мая 2020

Когда вы обращаетесь к dict, вы каждый раз несете накладные расходы на хеширование / поиск. Повторный поиск одного и того же ключа - пустая трата циклов, если вы собираетесь использовать его несколько раз в одном блоке кода. Сохранение результата в переменной будет быстрее и чище.

...