mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-21 18:54:20 +01:00
Translate Slowing down dict lookups example
This commit is contained in:
parent
00e420fc51
commit
4b4951d755
36
translations/README-ru.md
vendored
36
translations/README-ru.md
vendored
@ -3530,3 +3530,39 @@ def convert_list_to_string(l, iters):
|
||||
> должен быть один - и желательно только один - очевидный способ сделать это.
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Замедляем поиск по `dict` *
|
||||
<!-- Example ID: c9c26ce6-df0c-47f7-af0b-966b9386d4c3 --->
|
||||
```py
|
||||
some_dict = {str(i): 1 for i in range(1_000_000)}
|
||||
another_dict = {str(i): 1 for i in range(1_000_000)}
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```py
|
||||
>>> %timeit some_dict['5']
|
||||
28.6 ns ± 0.115 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
|
||||
>>> some_dict[1] = 1
|
||||
>>> %timeit some_dict['5']
|
||||
37.2 ns ± 0.265 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
|
||||
|
||||
>>> %timeit another_dict['5']
|
||||
28.5 ns ± 0.142 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
|
||||
>>> another_dict[1] # Пытаемся получить значение по несуществующему ключу
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
KeyError: 1
|
||||
>>> %timeit another_dict['5']
|
||||
38.5 ns ± 0.0913 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
|
||||
```
|
||||
Почему одни и те же выражения становятся медленнее?
|
||||
|
||||
#### 💡 Объяснение:
|
||||
|
||||
+ В CPython есть общая функция поиска по словарю, которая работает со всеми типами ключей (`str`, `int`, любой объект ...), и специализированная для распространенного случая словарей, состоящих только из `str`-ключей.
|
||||
+ Специализированная функция (названная `lookdict_unicode` в [исходный код CPython](https://github.com/python/cpython/blob/522691c46e2ae51faaad5bbbce7d959dd61770df/Objects/dictobject.c#L841)) знает, что все существующие ключи (включая искомый ключ) являются строками, и использует более быстрое и простое сравнение строк для сравнения ключей, вместо вызова метода `__eq__`.
|
||||
+ При первом обращении к экземпляру `dict` с ключом, не являющимся `str`, он модифицируется, чтобы в дальнейшем для поиска использовалась общая функция.
|
||||
+ Этот процесс не обратим для конкретного экземпляра `dict`, и ключ даже не обязательно должен существовать в словаре. Поэтому попытка неудачного поиска имеет тот же эффект.
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user