HTML Diff
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 &gt;&gt;&gt; dis.dis(compile('[]', '', 'eval')) 1 0 BUILD_LIST 0 3 RETURN_VALUE &gt;&gt;&gt; dis.dis(compile('list()', '', 'eval')) 1 0 LOAD_NAME 0 (list) 3 CALL_FUNCTION 0 6 RETURN_VALUE<p>Как можно видеть, в случае [] Python сразу создаёт байткод-инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать.</p>
6 &gt;&gt;&gt; dis.dis(compile('[]', '', 'eval')) 1 0 BUILD_LIST 0 3 RETURN_VALUE &gt;&gt;&gt; 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