Size: a a a

2019 November 05

DA

Dmitry Alimov in PiterPy Idle
Olya Telezhnaya
вот за это я больше люблю С++
дока у них в разы более информативная, точно ответила бы на такой вопрос, а в питоне ничего 🙁
В доке же есть
источник

OT

Olya Telezhnaya in PiterPy Idle
Dmitry Alimov
В доке же есть
про сложность примерно никогда в питоне не пишут
и в этом случае тоже
источник

RC

Ruslan Chekalov in PiterPy Idle
ну правильно, куда торопиться
источник

DA

Dmitry Alimov in PiterPy Idle
Olya Telezhnaya
про сложность примерно никогда в питоне не пишут
и в этом случае тоже
А, это да
источник

RC

Ruslan Chekalov in PiterPy Idle
выполняет за столько, за сколько нужно
источник

DA

Dmitry Alimov in PiterPy Idle
Ruslan Chekalov
выполняет за столько, за сколько нужно
😂
источник

DA

Dmitry Alimov in PiterPy Idle
👍🏻
источник

E

Eugene in PiterPy Idle
Я всё же померил

d = {i:i*2 for i in range(10000000)}

%timeit f = 5755947 in d
47.1 ns ± 0.438 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit f = 5755947 in d.keys()
107 ns ± 2.76 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

keys = d.keys()

%timeit f = 5755947 in keys
46.7 ns ± 0.327 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
источник

KP

Kirill Penzin in PiterPy Idle
Аллокация на 2-м вызове съедает время существенно
источник

KP

Kirill Penzin in PiterPy Idle
Хм, выглядит так, будто у дикта хранится сразу ещё массив всех его ключей внутри и вызов на in гоняется по нему. Прикольно.
источник

DA

Dmitry Alimov in PiterPy Idle
Eugene
Я всё же померил

d = {i:i*2 for i in range(10000000)}

%timeit f = 5755947 in d
47.1 ns ± 0.438 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit f = 5755947 in d.keys()
107 ns ± 2.76 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

keys = d.keys()

%timeit f = 5755947 in keys
46.7 ns ± 0.327 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
надо x in d_keys, где d_keys = d.keys()
источник

E

Eugene in PiterPy Idle
Dmitry Alimov
надо x in d_keys, где d_keys = d.keys()
так там такое есть. третий замер
источник

EM

Egor Molodik in PiterPy Idle
Kirill Penzin
Хм, выглядит так, будто у дикта хранится сразу ещё массив всех его ключей внутри и вызов на in гоняется по нему. Прикольно.
С 3.6 там в отдельном массиве же хранятся ключи в порядке добавления
источник

DA

Dmitry Alimov in PiterPy Idle
а точно
не дочитал
источник

KP

Kirill Penzin in PiterPy Idle
Egor Molodik
С 3.6 там в отдельном массиве же хранятся ключи в порядке добавления
Я не знал. Это круто)
источник

E

Eugene in PiterPy Idle
Kirill Penzin
Аллокация на 2-м вызове съедает время существенно
а это вот как раз создание keys view
источник

E

Eugene in PiterPy Idle
Egor Molodik
С 3.6 там в отдельном массиве же хранятся ключи в порядке добавления
В 3.7 они взяли реализацию словаря из pypy
источник

DA

Dmitry Alimov in PiterPy Idle
ага
источник

SS

Sergey Sokolov in PiterPy Idle
Eugene
Я всё же померил

d = {i:i*2 for i in range(10000000)}

%timeit f = 5755947 in d
47.1 ns ± 0.438 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit f = 5755947 in d.keys()
107 ns ± 2.76 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

keys = d.keys()

%timeit f = 5755947 in keys
46.7 ns ± 0.327 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Поковырял сишный код, оказывается, все dictviews хранят указатель на оригинальный словарь, и у dict_keys.__contains__ внутри вызывается по сути dict.__contains__ для этого указателя
Так что всё выглядит честно, вроде
источник

p

pragus in PiterPy Idle
Kirill Penzin
Я не знал. Это круто)
Это с pypy позаимствовали )
источник