{"componentChunkName":"component---src-templates-post-template-js","path":"/python-syntax-in-en","result":{"data":{"markdownRemark":{"id":"f537001e-abb4-5201-afbb-4e034a396a4b","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/python-syntax-in\">original page</a>.</p>\n</blockquote>\n<p>This article describes the surprising discovery that Python’s <code class=\"language-text\">in</code> for checking if a key exists in a dictionary and the <code class=\"language-text\">in</code> for array search are completely different.</p>\n<p>When doing competitive programming, you tend to be concerned about the computational complexity of each method.</p>\n<p>For example, when using Python, as you probably know, the computational complexity of the <code class=\"language-text\">Value in List</code> syntax for checking if a value exists in a list is O(N), making it very time-consuming.</p>\n<p>In my local environment, the execution time of the following code was about 600ms.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>i <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">in</span> Arr<span class=\"token punctuation\">)</span></code></pre></div>\n<p>This is because the implementation checks one by one whether a certain value exists in an array Arr with 10^7 elements defined by list comprehension.</p>\n<p>On the other hand, Python’s dictionary type also has the <code class=\"language-text\">Key in Dict</code> notation for checking whether a key exists in a dictionary.</p>\n<p>Embarrassingly, I had been under the impression that this computational complexity was also O(N) and time-consuming, so I thought it would be better to use the get method like <code class=\"language-text\">Dict.get(Key)</code> for key existence checking.</p>\n<p>However, I learned for the first time that Python’s <code class=\"language-text\">in</code> for checking if a key exists in a dictionary and the <code class=\"language-text\">in</code> for array search have completely different implementations, and moreover, <code class=\"language-text\">Key in Dict</code> runs faster than <code class=\"language-text\">Dict.get(Key)</code>, so I decided to write this article.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li><a href=\"#about-the-key-in-dict-implementation\">About the Key in Dict Implementation</a></li>\n<li><a href=\"#bonus-about-the-value-in-list-implementation\">Bonus: About the Value in List Implementation</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n<h2 id=\"about-the-key-in-dict-implementation\" style=\"position:relative;\"><a href=\"#about-the-key-in-dict-implementation\" aria-label=\"about the key in dict implementation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>About the Key in Dict Implementation</h2>\n<p>First, let’s look at the PyDict_Contains() function called by the <code class=\"language-text\">Key in Dict</code> notation.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">/</span><span class=\"token operator\">*</span> Return <span class=\"token number\">1</span> <span class=\"token keyword\">if</span> `key` <span class=\"token keyword\">is</span> <span class=\"token keyword\">in</span> <span class=\"token builtin\">dict</span> `op`<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span> <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">and</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> on error<span class=\"token punctuation\">.</span> <span class=\"token operator\">*</span><span class=\"token operator\">/</span>\n<span class=\"token builtin\">int</span>\nPyDict_Contains<span class=\"token punctuation\">(</span>PyObject <span class=\"token operator\">*</span>op<span class=\"token punctuation\">,</span> PyObject <span class=\"token operator\">*</span>key<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    Py_hash_t <span class=\"token builtin\">hash</span><span class=\"token punctuation\">;</span>\n    Py_ssize_t ix<span class=\"token punctuation\">;</span>\n    PyDictObject <span class=\"token operator\">*</span>mp <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>PyDictObject <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>op<span class=\"token punctuation\">;</span>\n    PyObject <span class=\"token operator\">*</span>value<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>!PyUnicode_CheckExact<span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span><span class=\"token operator\">|</span>\n        <span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>PyASCIIObject <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> key<span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> PyObject_Hash<span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    ix <span class=\"token operator\">=</span> _Py_dict_lookup<span class=\"token punctuation\">(</span>mp<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">,</span> <span class=\"token builtin\">hash</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ix <span class=\"token operator\">==</span> DKIX_ERROR<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>ix <span class=\"token operator\">!=</span> DKIX_EMPTY <span class=\"token operator\">&amp;</span><span class=\"token operator\">&amp;</span> value <span class=\"token operator\">!=</span> NULL<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://github.com/python/cpython/blob/818628c2da99ba0376313971816d472c65c9a9fc/Objects/dictobject.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">cpython/dictobject.c   python/cpython · GitHub</a></p>\n<p>In Python, all objects are accessed through pointers of type <code class=\"language-text\">PyObject</code>.\nThe <code class=\"language-text\">PyObject *op</code> given as an argument here points to the dictionary object being searched.</p>\n<p>Looking at the PyDict<em>Contains function processing, it first calculates a hash, then uses the _Py</em>dict<em>lookup function with that hash as an argument to determine if the key exists in the dictionary.\nThe processing of _Py</em>dict_lookup() is omitted here.</p>\n<p>In other words, unlike the list type’s <code class=\"language-text\">Value in List</code> syntax, key existence can be checked in O(logN) logarithmic time rather than O(N).</p>\n<p>Now let’s check what processing the <code class=\"language-text\">Dict.get(Key)</code> syntax I had been using performs.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">static PyObject <span class=\"token operator\">*</span>\ndict_get_impl<span class=\"token punctuation\">(</span>PyDictObject <span class=\"token operator\">*</span>self<span class=\"token punctuation\">,</span> PyObject <span class=\"token operator\">*</span>key<span class=\"token punctuation\">,</span> PyObject <span class=\"token operator\">*</span>default_value<span class=\"token punctuation\">)</span>\n<span class=\"token operator\">/</span><span class=\"token operator\">*</span><span class=\"token punctuation\">[</span>clinic end generated code<span class=\"token punctuation\">:</span> output<span class=\"token operator\">=</span>bba707729dee05bf <span class=\"token builtin\">input</span><span class=\"token operator\">=</span>279ddb5790b6b107<span class=\"token punctuation\">]</span><span class=\"token operator\">*</span><span class=\"token operator\">/</span>\n<span class=\"token punctuation\">{</span>\n    PyObject <span class=\"token operator\">*</span>val <span class=\"token operator\">=</span> NULL<span class=\"token punctuation\">;</span>\n    Py_hash_t <span class=\"token builtin\">hash</span><span class=\"token punctuation\">;</span>\n    Py_ssize_t ix<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>!PyUnicode_CheckExact<span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span><span class=\"token operator\">|</span>\n        <span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>PyASCIIObject <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> key<span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token builtin\">hash</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token builtin\">hash</span> <span class=\"token operator\">=</span> PyObject_Hash<span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">hash</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">return</span> NULL<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    ix <span class=\"token operator\">=</span> _Py_dict_lookup<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">,</span> <span class=\"token builtin\">hash</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>val<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ix <span class=\"token operator\">==</span> DKIX_ERROR<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> NULL<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ix <span class=\"token operator\">==</span> DKIX_EMPTY <span class=\"token operator\">|</span><span class=\"token operator\">|</span> val <span class=\"token operator\">==</span> NULL<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        val <span class=\"token operator\">=</span> default_value<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    Py_INCREF<span class=\"token punctuation\">(</span>val<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> val<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://github.com/python/cpython/blob/818628c2da99ba0376313971816d472c65c9a9fc/Objects/dictobject.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">cpython/dictobject.c   python/cpython · GitHub</a></p>\n<p>Surprisingly, we can see there is almost no difference in implementation from the PyDict_Contains function called when using the <code class=\"language-text\">Key in Dict</code> syntax.</p>\n<p>Taking a diff shows there is almost no difference in the main implementation parts.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/c41bc80e8b3439629fee212ac4cccbad/2bef9/image-1024x416.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 40.833333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAARlAAAEZQAGA43XUAAABmElEQVQoz2WS3XKbMBSEeYs0Yw8IkAGB+DPin9iO7TgJidNepJ1c9P1fY7v2NJ3J9OLjIOmwZxewZt/HRxji3fPwncyuizchcLZtzIslnl2Bvk9xOneYf4y4f6xJhd2DwfZYYXOouDY4zg2aMYEVUmCdJKi1RhIEiKVEvFoh4r6kqJI+iirG9mBwmifWGt2dJukXhk2GeohhjcslfsYxPrIMZ8fBK0UuPN9+w3xzgyeeB3QuOURFCq7rwWGfEO4V9y+CqVyasFa8aDZ3ZYnRGPSs2cUpRQIKh2xe0bXHdVEUMOy5oJSC9OVVxLYdYl+xSm4UjsDEyBOdVnww40FO9GKBnJPzXEFpibotMUwGxTqGSuSVUHnE/Yd1R/sPdPBKwZc0xYH3e8/HPQd1jDzyvK411k2CaVvjcBrQDCmqVqM0CjqXX7A0nbSM2EcRan7thrR8BRUp6dZEATb7EseXCu+/d3j7NWH3VGDaa/S7GP1Wkc+qYAnfg6Arm44cCnwi+DtdqgwDZGUM0yVox4zRPUSJx7hE+//xB/5r9Exiezr9AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/c41bc80e8b3439629fee212ac4cccbad/8ac56/image-1024x416.webp 240w,\n/static/c41bc80e8b3439629fee212ac4cccbad/d3be9/image-1024x416.webp 480w,\n/static/c41bc80e8b3439629fee212ac4cccbad/e46b2/image-1024x416.webp 960w,\n/static/c41bc80e8b3439629fee212ac4cccbad/a9a89/image-1024x416.webp 1024w\"\n              sizes=\"(max-width: 960px) 100vw, 960px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/c41bc80e8b3439629fee212ac4cccbad/8ff5a/image-1024x416.png 240w,\n/static/c41bc80e8b3439629fee212ac4cccbad/e85cb/image-1024x416.png 480w,\n/static/c41bc80e8b3439629fee212ac4cccbad/d9199/image-1024x416.png 960w,\n/static/c41bc80e8b3439629fee212ac4cccbad/2bef9/image-1024x416.png 1024w\"\n            sizes=\"(max-width: 960px) 100vw, 960px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/c41bc80e8b3439629fee212ac4cccbad/d9199/image-1024x416.png\"\n            alt=\"image\"\n            title=\"image\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Also, what surprised me was that the dict<em>get</em>impl function called by the <code class=\"language-text\">Dict.get(Key)</code> syntax calls the Py_INCREF() macro processing, making the execution time slightly longer.</p>\n<p>Reference: <a href=\"https://docs.python.org/ja/3/c-api/refcounting.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Reference Counting — Python 3.9.4 Documentation</a></p>\n<p>When I actually implemented a competitive programming problem using Python’s dictionary type with both the <code class=\"language-text\">Key in Dict</code> syntax and the <code class=\"language-text\">Dict.get(Key)</code> syntax, I confirmed that the <code class=\"language-text\">Key in Dict</code> syntax had an execution time a few milliseconds shorter.</p>\n<h2 id=\"bonus-about-the-value-in-list-implementation\" style=\"position:relative;\"><a href=\"#bonus-about-the-value-in-list-implementation\" aria-label=\"bonus about the value in list implementation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bonus: About the Value in List Implementation</h2>\n<p>I also took a look at the implementation of the <code class=\"language-text\">Value in List</code> syntax for checking if a value exists in a list.</p>\n<p>As it appears, it’s an O(N) process that uses a for loop to compare values from the starting address of the list object.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">static <span class=\"token builtin\">int</span>\nlist_contains<span class=\"token punctuation\">(</span>PyListObject <span class=\"token operator\">*</span>a<span class=\"token punctuation\">,</span> PyObject <span class=\"token operator\">*</span>el<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    PyObject <span class=\"token operator\">*</span>item<span class=\"token punctuation\">;</span>\n    Py_ssize_t i<span class=\"token punctuation\">;</span>\n    <span class=\"token builtin\">int</span> <span class=\"token builtin\">cmp</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">cmp</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">;</span> <span class=\"token builtin\">cmp</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;</span><span class=\"token operator\">&amp;</span> i <span class=\"token operator\">&lt;</span> Py_SIZE<span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">+</span><span class=\"token operator\">+</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        item <span class=\"token operator\">=</span> PyList_GET_ITEM<span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Py_INCREF<span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token builtin\">cmp</span> <span class=\"token operator\">=</span> PyObject_RichCompareBool<span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">,</span> el<span class=\"token punctuation\">,</span> Py_EQ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Py_DECREF<span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">cmp</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://github.com/python/cpython/blob/818628c2da99ba0376313971816d472c65c9a9fc/Objects/listobject.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">cpython/listobject.c  python/cpython · GitHub</a></p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>While solving competitive programming problems, I had the question “Wouldn’t implementing key search with <code class=\"language-text\">in</code> cause TLE even though I’m using an associative array??” which led me to dig into CPython’s source code.</p>\n<p>I wrote this article as a memorandum since I investigated seriously, but I feel my understanding of language specifications deepened by tracing CPython’s source, so I’d like to continue doing similar things in the future.</p>\n<p>By the way, if you just want to know the computational complexity, <a href=\"https://wiki.python.org/moin/TimeComplexity\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TimeComplexity - Python Wiki</a> is useful.</p>","fields":{"slug":"/python-syntax-in-en","tagSlugs":["/tag/python-en/","/tag/english/"]},"frontmatter":{"date":"2021-07-23","description":"This article describes the surprising discovery that Python's 'in' for checking if a key exists in a dictionary and the 'in' for array search are completely different.","tags":["Python (en)","English"],"title":"The Story of How Python's Dictionary 'in' and Array 'in' Are Completely Different","socialImage":{"publicURL":"/static/dc4d8b7f8795f3c3d3489d9957d155f2/no-image.png"}}}},"pageContext":{"slug":"/python-syntax-in-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}