Ух, как же я обожаю данный курс, и он действительно самый лучший, я подозревал что bytes кеширует хеши, видимо и со str так же. Интересно посмотреть видео и по другим контейнерам, и что-то мне подсказывает что тот же set comprehension сначало загоняет данные в обычный контейнер (чтоб не рехешировать), а затем определяет capacity, и все вгоняет в хэш таблицу, угадал?
``` typedef struct { PyObject *key; Py_hash_t hash; /* Cached hash code of the key */ } setentry; ``` Сам по себе set-comprehension не отличается особо от set-literal. в первом случае будет `BUILD_SET` + `SET_ADD` (вызывает `PySet_Add`, во втором просто `BUILD_SET` с известными уже данными, внутри все равно вызывается `PySet_Add`. Хеш в `Py_hash_t hash` пересчитывается при каждом добавлении, см `static int set_add_key(PySetObject *so, PyObject *key)` Спасибо за вопрос! О set еще поговорим! :)
И вот такой вопрос, почему отсутствует under метод __min__ и __max__, просто если работать с математическими контейнерами например numpy или какие нибудь vec2, хочется получить например: min(vec2(1.0, 1,5), vec(-0.5, 2.5)) -> vec(-0.5, 1.5), а не минимальный float, просто на с++ с этим все окей. Просто этом момент путает и его можно было-бы улучшить
@@sobolevn скорей всего тебе не приходилось работать с линейной алгеброй, если в min засунуть два вектора, то оно должно создать новый объект, который поиндексно сравниваеться, и оно должно возвращать новый объект из результата сравнений, в том же numpy для таких целей есть одноименная функция, что как по мне немного не правильно, и появление under методов __min__, __max__ решило бы эту проблему: ``` class vec2: def __init__(self, x, y): self.x = x self.y = y
Никита спасибо, отличное видео!
Это реально лучший курс я пишу уже не один год, но никогда особо не вникал как оно работает под капотом.
Продолжай в том же духе. Реально хорошо получается. Будет круто если как нить про typing расскажешь, но я думаю все запланировано, так что удачи
Ух, как же я обожаю данный курс, и он действительно самый лучший, я подозревал что bytes кеширует хеши, видимо и со str так же. Интересно посмотреть видео и по другим контейнерам, и что-то мне подсказывает что тот же set comprehension сначало загоняет данные в обычный контейнер (чтоб не рехешировать), а затем определяет capacity, и все вгоняет в хэш таблицу, угадал?
```
typedef struct {
PyObject *key;
Py_hash_t hash; /* Cached hash code of the key */
} setentry;
```
Сам по себе set-comprehension не отличается особо от set-literal. в первом случае будет `BUILD_SET` + `SET_ADD` (вызывает `PySet_Add`, во втором просто `BUILD_SET` с известными уже данными, внутри все равно вызывается `PySet_Add`. Хеш в `Py_hash_t hash` пересчитывается при каждом добавлении, см `static int set_add_key(PySetObject *so, PyObject *key)`
Спасибо за вопрос! О set еще поговорим! :)
Все знают что единственное отличие 2 и 3 питона - это print
И вот такой вопрос, почему отсутствует under метод __min__ и __max__, просто если работать с математическими контейнерами например numpy или какие нибудь vec2, хочется получить например: min(vec2(1.0, 1,5), vec(-0.5, 2.5)) -> vec(-0.5, 1.5), а не минимальный float, просто на с++ с этим все окей. Просто этом момент путает и его можно было-бы улучшить
Если `__gt__` и другие методы сравнения для `min` / `max`. Пример:
```python
>>> class A:
... def __gt__(self, other):
... print(f'> {other}')
... return True
...
>>> min([A(), 1])
> 1
1
```
@@sobolevn скорей всего тебе не приходилось работать с линейной алгеброй, если в min засунуть два вектора, то оно должно создать новый объект, который поиндексно сравниваеться, и оно должно возвращать новый объект из результата сравнений, в том же numpy для таких целей есть одноименная функция, что как по мне немного не правильно, и появление under методов __min__, __max__ решило бы эту проблему:
```
class vec2:
def __init__(self, x, y):
self.x = x
self.y = y
def min(self, other):
return vec2(min(self.x, other.x), min(self.y, other.y))
def __iter__(self):
return iter((self.x, self.y))
def __str__(self):
return f'x={self.x}, y={self.y}'
def __gt__(self, other):
return True
v1 = vec2(1.5, 2.5)
v2 = vec2(-0.5, 5.5)
print('min from one arg = ', min(v1)) # 1.5 - good
print('method = ', v1.min(v2)) # x=-0.5, y=2.5 - good
print('under_ = ', min(v1, v2)) # x=-0.5, y=5.5 - bad
```
Лекция классная, но звук очень тихий.
Всегда вижу такой комментарий под роликом данного автора, это типо мем такой? Вроде слышно отлично.