Неожиданное снижение производительности в непроверенном наборе в python

#python

Вопрос:

Операции набора отдельно маринованных объектов значительно медленнее, чем операции набора обычных объектов или совместно маринованных объектов.

 import random import timeit import pickle  data = set(tuple([n]*100) for n in range(2000)) subset = set(random.sample(data, k=1000))  data2 = pickle.loads(pickle.dumps(data)) subset2 = pickle.loads(pickle.dumps(subset))  data3, subset3 = pickle.loads(pickle.dumps([data, subset]))  print(timeit.timeit(lambda: data amp; subset, number=1000)) print(timeit.timeit(lambda: data2 amp; subset2, number=1000)) print(timeit.timeit(lambda: data3 amp; subset3, number=1000))  

выход из строя:

 0.037282757000184574 1.339586072999964 0.038100944000007075  

Разница почти 3000%. В чем может быть причина?

Ответ №1:

Виновником было то, что отдельно маринованные объекты имеют разные адреса памяти, в то время как в других 2 случаях объекты имеют один и тот же адрес памяти.

Кредиты @hexnewbie с #python канала LiberaChat.

 len({id(x) for x in data} amp; {id(x) for x in subset}) # 1000 len({id(x) for x in data2} amp; {id(x) for x in subset2}) # 0 len({id(x) for x in data3} amp; {id(x) for x in subset3}) # 1000