#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