0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, timeit, dict(), list(), микрооптимизация производительности, токены языка, globals, builtin, создать новый фрейм на стеке, namespace, call_function</p>
1
<p>Теги: python, timeit, dict(), list(), микрооптимизация производительности, токены языка, globals, builtin, создать новый фрейм на стеке, namespace, call_function</p>
2
<p>Чаще всего микрооптимизации производительности только ухудшают качество кода, его становится сложнее читать. Но их полезно знать и хорошо бы в них разбираться, потому что сам процесс исследования позволяет глубже понять язык.</p>
2
<p>Чаще всего микрооптимизации производительности только ухудшают качество кода, его становится сложнее читать. Но их полезно знать и хорошо бы в них разбираться, потому что сам процесс исследования позволяет глубже понять язык.</p>
3
<h2>Например, что быстрее: {} или dict()? Ну или, [] или list()?</h2>
3
<h2>Например, что быстрее: {} или dict()? Ну или, [] или list()?</h2>
4
<p>На поставленный вопрос легко ответить, воспользовавшись<strong>timeit</strong>. [] и {} в несколько раз быстрее их оппонентов. Более интересный вопрос: почему?</p>
4
<p>На поставленный вопрос легко ответить, воспользовавшись<strong>timeit</strong>. [] и {} в несколько раз быстрее их оппонентов. Более интересный вопрос: почему?</p>
5
<p>В данном случае ответить нам поможет модуль<strong>dis</strong>:</p>
5
<p>В данном случае ответить нам поможет модуль<strong>dis</strong>:</p>
6
>>> dis.dis(compile('[]', '', 'eval')) 1 0 BUILD_LIST 0 3 RETURN_VALUE >>> dis.dis(compile('list()', '', 'eval')) 1 0 LOAD_NAME 0 (list) 3 CALL_FUNCTION 0 6 RETURN_VALUE<p>Как можно видеть, в случае [] Python сразу создаёт байткод-инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать.</p>
6
>>> dis.dis(compile('[]', '', 'eval')) 1 0 BUILD_LIST 0 3 RETURN_VALUE >>> dis.dis(compile('list()', '', 'eval')) 1 0 LOAD_NAME 0 (list) 3 CALL_FUNCTION 0 6 RETURN_VALUE<p>Как можно видеть, в случае [] Python сразу создаёт байткод-инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать.</p>
7
<p><strong>list()</strong>и<strong>dict()</strong>же представляют из себя вызов функции, для которого нужно сначала отрезолвить их имя (поискать в<strong>globals</strong>и<strong>builtin</strong>), создать новый фрейм на стеке. Поиска в глобальной<strong>namespace’е</strong>ещё можно избежать, сохранив имя локально. Т.е. сделав, например:</p>
7
<p><strong>list()</strong>и<strong>dict()</strong>же представляют из себя вызов функции, для которого нужно сначала отрезолвить их имя (поискать в<strong>globals</strong>и<strong>builtin</strong>), создать новый фрейм на стеке. Поиска в глобальной<strong>namespace’е</strong>ещё можно избежать, сохранив имя локально. Т.е. сделав, например:</p>
8
<p>Но от<strong>CALL_FUNCTION</strong>избавиться не выйдет никак.</p>
8
<p>Но от<strong>CALL_FUNCTION</strong>избавиться не выйдет никак.</p>
9
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
9
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
10
10