Все эти результаты были получены с помощью CPython 3.5.2.Странные характеристики для заданных операций
Я заметил странные характеристики некоторых операций класса set
.
Я измерил время, необходимое для выполнения объединения двух наборов, содержащих только целые числа. Конечно, это время зависит от размеров наборов. Удивительно, но это также зависит от «плотности» целых чисел. Здесь представлен график:
Ось й является суммой размеров двух наборов (которые были выбраны случайным образом и независимо друг от друга, для каждого опыта). Ось y - это время, в секундах (в шкале журнала).
Плотность d
означает, что наборы были созданы путем выборки N
целых чисел из общего числа N/d
целых чисел. Другими словами, для плотности 0,5 возьмем одну половину целых чисел некоторого интервала, тогда как для плотности 0,1 возьмем одну десятую целых чисел некоторого (большего) интервала.
Это минимальный код для получения некоторых результатов (при необходимости я могу опубликовать полный код, который я использовал для сюжета, но он длиннее).
import time
import random
import numpy
def get_values(size, density):
return set(random.sample(range(int(size/density)), size))
def perform_op(size, density):
values1 = get_values(size, density)
values2 = get_values(size, density)
t = time.time()
result = values1 | values2
return time.time()-t
size = 10000000
for density in [0.05, 0.1, 0.5, 0.99]:
times = [perform_op(size, density) for _ in range(10)]
print('density: %.2f, mean time: %.4f, standard deviation: %.4f' % (density, numpy.mean(times), numpy.std(times)))
Союз:
density: 0.05, time: 0.9846, standard deviation: 0.0440
density: 0.10, time: 1.0141, standard deviation: 0.0204
density: 0.50, time: 0.5477, standard deviation: 0.0059
density: 0.99, time: 0.3440, standard deviation: 0.0020
Существует примерно коэффициент 3 для вычисления времени между самым быстрым и самым медленным, с множества, имеющие одинаковый размер . Кроме того, для низких плотностей существует гораздо большая изменчивость.
Забавная вещь состоит в том, для пересечения (заменить values1 | values2
на values1 & values2
в perform_op
функции), мы также не постоянное представление, но модель отличается:
density: 0.05, time: 0.3928, standard deviation: 0.0046
density: 0.10, time: 0.4876, standard deviation: 0.0041
density: 0.50, time: 0.5975, standard deviation: 0.0127
density: 0.99, time: 0.3806, standard deviation: 0.0015
Я не проверял другие установленные операции ,
Я не понимаю, почему существуют такие различия. Из того, что я знаю, наборы Python реализованы с помощью хеш-таблиц, поэтому плотность целых чисел не должна иметь значения, пока их хэши хорошо распределены.
Каково происхождение этих разных выступлений?
Эффективности хэша-набора будет зависеть от количества элементов, которые хэш с тем же ведром. Это, в свою очередь, будет зависеть от размера самого набора и распределения чисел. Я позволю кому-то, более знакомому с реализацией 'set', дать правильный ответ. –