установить разницу производительности issubset в зависимости от типа аргумента

почему этот вопрос?

Я пытался ответить на этот вопрос: Отметьте, если все Значения существуют как ключи в словаре с чем-то лучшим, чем понимание генератора, переданное в all (петли Python, даже в пониманиях, медленные невыполнение по сравнению с неявными циклами, выполняемыми некоторыми функциями):

all(i in bar for i in foo)

где bar является словарем, а foo - это список с использованием set.issubset (с преобразованием в set из foo, чтобы можно было использовать foo.issubset(bar)), и не удалось превзойти время решения all (если оба контейнера не преобразованы в ---- +: = 9 = + ---- s)

.

мой вопрос:

Из документации set :

  

Обратите внимание, что неоператорные версии методов union (), intersection (), разностного () иmmetric_difference (), issubset () и issperset () будут принимать любую итерацию в качестве аргумента . Напротив, их операторные аналоги требуют, чтобы их аргументы были множествами. Это исключает подверженные ошибкам конструкции, такие как set ('abc') и amp; 'cbs' в пользу более читабельного множества ('abc'). intersection ('cbs').

Хорошо, но производительность действительно зависит от типа аргумента, даже если сложность этого не делает ( Сложность Python issubset () ):

set

мои результаты (Python 3.4):

import timeit
foo = {i for i in range(1, 10000, 2)}
bar = foo - {400}
n=10000
x = timeit.timeit(setup="foo = {str(i) for i in range(1, 10000, 2)};bar = foo - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(set)",x)
x = timeit.timeit(setup="foo = {str(i) for i in range(1, 10000, 2)};bar = foo - {'400'};foo=list(foo)",stmt="bar.issubset(foo)",number=n)
print("issubset(list)",x)
x = timeit.timeit(setup="foo = {str(i):i for i in range(1, 10000, 2)};bar = set(foo) - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(dict)",x)
x = timeit.timeit(setup="foo = {str(i):i for i in range(1, 10000, 2)}.keys();bar = set(foo) - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(dict_keys)",x)

Таким образом, если в качестве аргумента передано issubset(set) 1.6141405847648826 issubset(list) 3.698748032058883 issubset(dict) 3.6300025109004244 issubset(dict_keys) 4.224299651223102 , результат будет очень быстрым.

Использование set намного медленнее. Я понял, что из-за хэша, который должен быть сделан на строках, это дорого. Поэтому я изменил свои тестовые входные данные с помощью целых чисел, как это:

list

и результаты были глобально быстрее, но все еще огромная разница во времени:

foo = {i for i in range(1, 10000, 2)}
bar = foo - {400}

Я также пытался изменить issubset(set) 0.5981848205989139 issubset(list) 1.7991591232742143 issubset(dict) 1.889119736960271 issubset(dict_keys) 2.2531574114632678 на dict как и в python 3, ключи называются ( https: //www .python.org /dev /peps /pep-3106 /) "объект типа контейнера или неупорядоченный контейнер".

Но в этом случае результат будет еще хуже, чем с dict.keys() или dict

Так почему передача list бьет, передавая set или list или dict object? Я не вижу ничего упомянутого в документации по этому поводу.

4 голоса | спросил Jean-François Fabre 6 J0000006Europe/Moscow 2018, 22:26:20

1 ответ


0
Алгоритму ---- +: = 0 =: + ---- требуется набор для работы (количество заморозок и подклассов);если вы передадите ему что-то еще, он сделает наборЭто в основном ---- +: = 1 =: + ---- , и нужно знать, что ---- +: = 2 =: + ---- является эффективным и означает, что это означает для множеств.Единственный способ, которым он знает, как гарантировать это, состоит в том, чтобы обеспечить ---- +: = 3 =: + ---- набор.Изготовление набора стоит дорого.(Я замутил некоторые детали. Если вы хотите точно знать, что происходит, особенно если у вас странный набор подклассов, прочитайте исходный код по ссылке.)
ответил user2357112 6 J0000006Europe/Moscow 2018, 22:43:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132