Size: a a a

2020 August 02

MW

Mr. Wh🦠er in pro.python
 ‌‌Gleb Pilipets
Можно вопрос по двум реализация хеш-сета - знаю, что размер не простое число и хеш-функция не идеально подобрана, и ресайза нету, и много других проблем. Вопрос в другом: для первого кода возвращается время выполнения 208 ms, а для второго ~2200 ms - почему, если они практически идентичны?
-------------------------1 реализация-------------------------------
class MyHashSet:
   def __init__(self):
       self.limit = 10000
       self.buckets = [[] for _ in range(self.limit)]
   def add(self, key: int) -> None:
       if not self.contains(key):
           bucket = self.buckets[self._bucket(key)]
           bucket.append(key)
   def remove(self, key: int) -> None:
       bucket = self.buckets[self._bucket(key)]
       if self.contains(key):
           bucket.remove(key)
   def _bucket(self, key):
       return key % self.limit
   def contains(self, key: int) -> bool:
       bucket = self.buckets[self._bucket(key)]
       for value in bucket:
           if value == key:
               return True
       return False
-----------------------------2 реализация------------------------
class MyHashSet:
   def get_bucket(self, key):
       return self.data[key%10000]
   def __init__(self):
       self.data = [[]]*10000
   def add(self, key):
       arr = self.get_bucket(key)
       if key in arr: return
       arr.append(key)
   def remove(self, key):
       arr = self.get_bucket(key)
       if key not in arr: return
       arr.remove(key)
   def contains(self, key):
       arr = self.get_bucket(key)
       return key in arr
Ну само название HashSet подразумевает, что этот класс должен наследоваться от set либо от map (который и есть hash)
источник

MW

Mr. Wh🦠er in pro.python
у тебя там линейный поиск
источник

AB

Artöm Bakri Al-Sarmi... in pro.python
Не обязан он ни от чего наследоваться
источник

OS

Oleg Serikov in pro.python
так вроде рофл в том, что линейный поиск быстрее чем ин на тестах
источник

 P

 ‌‌Gleb Pilipets... in pro.python
ладно, я нашёл проблему
источник

MW

Mr. Wh🦠er in pro.python
я вообще не пойму что это за дрисня и зачем она нужна
источник

OS

Oleg Serikov in pro.python
 ‌‌Gleb Pilipets
ладно, я нашёл проблему
о а в чом она?
источник

 P

 ‌‌Gleb Pilipets... in pro.python
[[]]*10000  vs [[] for _ in range(10000)]
источник

 P

 ‌‌Gleb Pilipets... in pro.python
не понятно, почему, но первое очень медленно
источник

OS

Oleg Serikov in pro.python
а ы ого
источник

OS

Oleg Serikov in pro.python
а какой поиск быстрее — ин или линейный — на тестах?
источник

 P

 ‌‌Gleb Pilipets... in pro.python
Mr. Wh🦠er
я вообще не пойму что это за дрисня и зачем она нужна
было интересно понять, почему падает скорость выполнения
источник

 P

 ‌‌Gleb Pilipets... in pro.python
Oleg Serikov
а какой поиск быстрее — ин или линейный — на тестах?
не думаю, что сильно влияет, но из-за этого разность по скорости выполнения в 10 раз...
[[]]*10000  vs [[] for _ in range(10000)]
источник

MW

Mr. Wh🦠er in pro.python
линейный поиск не может быстрее работать. никак. вообще.
источник

AB

Artöm Bakri Al-Sarmi... in pro.python
На небольшом числе элементов вполне может
источник

A

Aliaksei Karatynski in pro.python
 ‌‌Gleb Pilipets
[[]]*10000  vs [[] for _ in range(10000)]
Первый вариант вообще не стоит никогда юзать
источник

 P

 ‌‌Gleb Pilipets... in pro.python
Aliaksei Karatynski
Первый вариант вообще не стоит никогда юзать
не понятно, как он реализован, что работает медленее
источник

A

Aliaksei Karatynski in pro.python
 ‌‌Gleb Pilipets
не понятно, как он реализован, что работает медленее
Кроме этого ты в таком случае получаешь 10000 ссылок на один и тот же список. А во втором случае все списки будут разными
источник

 P

 ‌‌Gleb Pilipets... in pro.python
Aliaksei Karatynski
Кроме этого ты в таком случае получаешь 10000 ссылок на один и тот же список. А во втором случае все списки будут разными
Хм...
Этого не знал про первый вариант, спасибо
источник

A

Aliaksei Karatynski in pro.python
 ‌‌Gleb Pilipets
Хм...
Этого не знал про первый вариант, спасибо
>>> a = [[]] * 3
>>> a[1].append(10)
>>> a
[[10], [10], [10]]
источник