<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Idi Suda</title><generator>teletype.in</generator><description><![CDATA[Idi Suda]]></description><image><url>https://teletype.in/files/28/3e/283e6a41-6793-4603-a107-086cc912fbfa.png</url><title>Idi Suda</title><link>https://teletype.in/@bvrch</link></image><link>https://teletype.in/@bvrch?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=bvrch</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/bvrch?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/bvrch?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 13 May 2026 20:40:16 GMT</pubDate><lastBuildDate>Wed, 13 May 2026 20:40:16 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@bvrch/Hy5wvP-gI</guid><link>https://teletype.in/@bvrch/Hy5wvP-gI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=bvrch</link><comments>https://teletype.in/@bvrch/Hy5wvP-gI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=bvrch#comments</comments><dc:creator>bvrch</dc:creator><title>Представление в памяти</title><pubDate>Tue, 07 Jan 2020 02:05:21 GMT</pubDate><description><![CDATA[Перемещая элементы в структурах данных общего назначения, мы копируем адрес. Т.е. всегда существует одна копия объекта, независимо от того, сколько раз он появляется в tuple/list/dict]]></description><content:encoded><![CDATA[
  <p>Перемещая элементы в структурах данных общего назначения, мы копируем адрес. Т.е. всегда существует одна копия объекта, независимо от того, сколько раз он появляется в tuple/list/dict</p>
  <p></p>
  <h3>Int</h3>
  <pre>x = 123</pre>
  <ul>
    <ul>
      <li>refcount</li>
      <li>address of type <code>-&gt; type &lt;int&gt;</code></li>
      <li>123</li>
    </ul>
  </ul>
  <hr />
  <h3>String</h3>
  <pre>s = &#x27;Hello!&#x27;</pre>
  <ul>
    <ul>
      <li>refcount</li>
      <li>address of type <code>-&gt; type &lt;str&gt;</code></li>
      <li>length</li>
      <li>hash</li>
      <li>flags</li>
      <li>address = 0</li>
      <li>&#x27;Hello!&#x27;</li>
    </ul>
  </ul>
  <hr />
  <h3>Tuple</h3>
  <pre>t = (1, 2.0, &#x27;Hello!&#x27;)</pre>
  <ul>
    <ul>
      <li>refcount</li>
      <li>address of type <code>-&gt; type &lt;tuple&gt;</code></li>
      <li>length</li>
      <li>address <code>-&gt; int &lt;1&gt;</code></li>
      <li>address <code>-&gt; float &lt;2.0&gt;</code></li>
      <li>address <code>-&gt; str &lt;&#x27;Hello!&#x27;&gt;</code></li>
    </ul>
  </ul>
  <blockquote><em><u>Для последних трех адресов эта техника называется <code>indirection</code>, т.е. хранятся просто адреса, а не объекты.</u></em></blockquote>
  <p></p>
  <p>Вот как <code>tuple(10, 20)</code> описан на C:</p>
  <pre>typedef struct {
        Py_ssize_t ob_refcnt;
        struct _typeobject *ob_type;
        Py_ssize_t ob_size;
        PyObject *ob_item[2];     /* store a pointer to 10 and a pointer to 20 */
    } PyTupleObject;</pre>
  <p>Заметьте, что <code>tuple</code> включает в себя непосредственно два указателя на данные.</p>
  <hr />
  <h3>Dict</h3>
  <p>За каждым dict - массив, в котором ключи хранятся на индексах согласно их hash value. Каждый слот должен хранить ключ и хэш.</p>
  <p>Словарь обычно растёт увеличиваясь в 2 или в 4 раза. Расширение происходит, когда он заполнен на 2/3.</p>
  <hr />
  <h3>List</h3>
  <pre>my_list = [1, 2, 3]</pre>
  <p>Чтобы расти, списку необходимо переместиться, но объекты в Python не могут менять адрес. Спасает двойной <code>indirection</code>.</p>
  <ul>
    <ul>
      <li>refcount</li>
      <li>address of type <code>-&gt; type &lt;list&gt;</code></li>
      <li>length = 3</li>
      <li>array address <code>-&gt; указывает на список из 4 элементов, один из которых пустой, о нём ниже</code></li>
      <ul>
        <li>array len = 4</li>
      </ul>
    </ul>
  </ul>
  <p>Почему есть пустой элемент во &quot;внутреннем&quot; списке? Если бы не резервировалось для него место, то для каждого <code>append()</code> надо было заноыо выделять место. Это дорого - каждый адрес эл-та копируется в новое место. </p>
  <p>Релокация на каждом следующем append() суммируется:<br />	- Чтобы добавить 2 эл-т в список нужно скопировать адрес 1 эл-та<br />	- Чтобы добавить 3 эл-т в список нужно скопировать адрес 1 и 2 эл-тов<br />И т.д.<br /><code>append()</code> на полный список запрашивает доп слоты для элементов. Списки в среднем используют 94% своих слотов, потребляя на 6% больше места, чем они используют. </p>
  <p>Вот описание на C:</p>
  <pre>   PyObject arr[2];              /* store a pointer to 10 and a pointer to 20 */

    typedef struct {
        Py_ssize_t ob_refcnt;
        struct _typeobject *ob_type;
        Py_ssize_t ob_size;
        PyObject **ob_item = arr; /* store a pointer to the two-pointer array */
        Py_ssize_t allocated;
    } PyListObject;</pre>
  <p>Заметьте, что список включает в себя указатель ещё один уровень indirect, храня указатель на внешний массив с указателями.</p>

]]></content:encoded></item></channel></rss>