mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-22 02:54:25 +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