<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yumyum116</title>
    <description>The latest articles on DEV Community by yumyum116 (@yumyum116).</description>
    <link>https://dev.to/yumyum116</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3690943%2F5428d040-1e2e-4a49-8f1c-a8a1916b4211.png</url>
      <title>DEV Community: yumyum116</title>
      <link>https://dev.to/yumyum116</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yumyum116"/>
    <language>en</language>
    <item>
      <title>Why print() Can Cause a TLE Even with an Efficient Algorithm</title>
      <dc:creator>yumyum116</dc:creator>
      <pubDate>Sun, 11 Jan 2026 08:07:32 +0000</pubDate>
      <link>https://dev.to/yumyum116/why-print-can-cause-a-tle-even-with-an-efficient-algorithm-4f7e</link>
      <guid>https://dev.to/yumyum116/why-print-can-cause-a-tle-even-with-an-efficient-algorithm-4f7e</guid>
      <description>&lt;p&gt;Hi, everyone. This is yumyum116.&lt;/p&gt;

&lt;p&gt;This article is part of a series of &lt;code&gt;how standard library functions work&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I am glad that this will help beginners understand the underlying mechanisms behind these functions.&lt;/p&gt;

&lt;p&gt;This topic arose from a personal experience in which I encountered a TLE, despite using an efficient algorithm to solve the problem. After investigating, &lt;strong&gt;I discovered that the issue was caused by calling the &lt;code&gt;print&lt;/code&gt; function too many times within the program&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Based on this experience, this article explains how the &lt;code&gt;print&lt;/code&gt; function works internally and &lt;strong&gt;why excessive use of it can lead to a TLE&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Example of a TLE Despite Using an Efficient Algorithm&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this chapter, I introduce an example of a program that results in a TLE despite using an efficient algorithm.&lt;/p&gt;

&lt;p&gt;The program determines whether a given number is prime using the Sieve of Eratosthenes. At first glance, the algorithm itself is efficiet - but can you identify which part of the code causes of the TLE?&lt;/p&gt;

&lt;p&gt;For reference, the input number satisfies the following conditions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;conditions:&lt;br&gt;


&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;1&amp;lt;=n&amp;lt;=380,0001 &amp;lt;= n &amp;lt;= 380,000 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;380&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;br&gt;

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;1&amp;lt;=array[i]&amp;lt;=6,000,000(1&amp;lt;=i&amp;lt;=n)1 &amp;lt;= array[i] &amp;lt;= 6,000,000 (1 &amp;lt;= i &amp;lt;= n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;rr&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;000&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;000&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MAX_A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6000000&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;eratosthenes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;is_prime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;

&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not prime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, I introduce a program that that fixes the TLE issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MAX_A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6000000&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;eratosthenes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;is_prime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;is_prime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;is_prime&lt;/span&gt;

&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;is_prime_table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;eratosthenes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MAX_A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_prime_table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not prime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next chapter, let's take a closer look at why the TLE happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. What Happens Internally When Executing a Python Program&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before diving into the main discussion, let's take a look at what actually happens when a Python program is executed.&lt;/p&gt;

&lt;p&gt;This section is a bit long, but understanding of this flow will help you build a deeper intuition about how Python programs work under the hood.&lt;/p&gt;

&lt;p&gt;At a high level, the execution flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Execute a Python program.
-- the python interpreter starts runnung --&lt;/li&gt;
&lt;li&gt;Perform lexical analysis by breaking the source code into tokens.&lt;/li&gt;
&lt;li&gt;Generate a sequence of tokens.&lt;/li&gt;
&lt;li&gt;Parse the token sequence.&lt;/li&gt;
&lt;li&gt;Build an Abstract Syntax Tree (AST).&lt;/li&gt;
&lt;li&gt;Generate code objects from the AST.&lt;/li&gt;
&lt;li&gt;Compile the code objects into bytecode.&lt;/li&gt;
&lt;li&gt;Execute the bytecode on the Python virtual machine.
-- the python interpreter completes execution --&lt;/li&gt;
&lt;li&gt;Execute machine instructions on the CPU.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, let's walk through a simple example.&lt;/p&gt;

&lt;p&gt;Consider the following Python program (1).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test.py
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi, how are you?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lexical Analysis
&lt;/h3&gt;

&lt;p&gt;When the Python interpreter runs test.py, it first performs lexical analysis.&lt;/p&gt;

&lt;p&gt;During this process, the source code is broken down into tokens such as &lt;code&gt;Hi&lt;/code&gt;, &lt;code&gt;,&lt;/code&gt;, &lt;code&gt;how&lt;/code&gt;, &lt;code&gt;are&lt;/code&gt;, &lt;code&gt;you&lt;/code&gt;, and &lt;code&gt;?&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parsing
&lt;/h3&gt;

&lt;p&gt;Based on the tokens generated during lexical analysis, the interpreter builds a data structure called an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt; through parsing.&lt;/p&gt;

&lt;p&gt;Let's take an actual look at the AST objects generated when executing &lt;code&gt;test.py&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python
&amp;gt; import ast
&amp;gt; tree = ast.parse('print("Hi, how are you?")')
&amp;gt;
&amp;gt; print(ast.dump(tree, indent=4))
Module(
    body=[
        Expr(
            value=Call(
                func=Name(id='print', ctx=Load()),
                args=[
                    Constant(value='Hi, how are you?')],
                keywords=[]))],
    type_ignores=[])
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to better grasp the &lt;em&gt;structure&lt;/em&gt; of an AST, using a sentence that includes mathematical expressions can be very helpful. However, that is beyond the scope of this article.&lt;/p&gt;

&lt;p&gt;Now, let's break down the generated AST.&lt;/p&gt;

&lt;p&gt;① &lt;code&gt;func=Name(id = 'print', ctx=Load())&lt;/code&gt;&lt;br&gt;
This means the identifier &lt;code&gt;print&lt;/code&gt; is loaded as a value.&lt;br&gt;
&lt;code&gt;ctx&lt;/code&gt;, which is one of the arguments of the &lt;code&gt;Name&lt;/code&gt; node, specifies how the identifier is used. It can be set to &lt;code&gt;Store()&lt;/code&gt; when assigning a value, &lt;code&gt;Load()&lt;/code&gt; when reading a value, or &lt;code&gt;Del()&lt;/code&gt; when deleting an element.&lt;/p&gt;

&lt;p&gt;Structurally, this can be summarized as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;code&gt;Name&lt;/code&gt; node is a parsing node that contains the following information:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The presence of the identifier &lt;code&gt;print&lt;/code&gt; in the source code.&lt;/li&gt;
&lt;li&gt;How the identifier is used in context (in this example, it is used as &lt;code&gt;Load()&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;② &lt;code&gt;args=[Constant(value='Hi, how are you?')]&lt;/code&gt;&lt;br&gt;
This represents a structural node that holds the value of an argument  passed to a function. In computer science terms, this is an AST node that represents a string literal.&lt;/p&gt;

&lt;p&gt;For reference, the &lt;code&gt;Constant&lt;/code&gt; node has been used since Python 3.8, whereas &lt;code&gt;Str&lt;/code&gt; was used in earlier versions of Python (prior to 3.8).&lt;/p&gt;

&lt;p&gt;③ &lt;code&gt;Call(...)&lt;/code&gt;&lt;br&gt;
This node represents a function call statement and stores the following information:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;i. &lt;code&gt;func&lt;/code&gt; - information about the called object&lt;br&gt;
 ii. &lt;code&gt;args&lt;/code&gt; - expressions to be evaluated as positional arguments&lt;br&gt;
 iii. &lt;code&gt;keywords&lt;/code&gt; - expressions to be evaluated as keyword arguments&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;④ &lt;code&gt;Expr(...)&lt;/code&gt;&lt;br&gt;
This node represents an expression whose purpose is only to produce output.&lt;br&gt;
There are many other nodes at the same hierarchical level as &lt;code&gt;Expr&lt;/code&gt;, each serving a different role. However, due to the scope of this article, I will introduce those nodes in a separate article.&lt;/p&gt;

&lt;p&gt;⑤ &lt;code&gt;Module(...)&lt;/code&gt;&lt;br&gt;
This node represents the root AST node of a &lt;code&gt;.py&lt;/code&gt; file.&lt;br&gt;
As a supplement, &lt;code&gt;body=[...]&lt;/code&gt; is a list of statements included in the source code, and &lt;code&gt;type_ignores=[]&lt;/code&gt; stores additional information for type checkers. For example, it records the line numbers of comments that instruct the type checker to ignore type errors.&lt;/p&gt;
&lt;h3&gt;
  
  
  Generate Code Objects from the AST
&lt;/h3&gt;

&lt;p&gt;In this step, the following processes are performed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;① Analyze the AST and perform the following tasks:&lt;br&gt;
(i) Determine whether each variable is local, global, or free.&lt;br&gt;
(ii) Register constants in the constant table.&lt;br&gt;
(iii) Build a code object for each function and class.&lt;/p&gt;

&lt;p&gt;② Build the structural body of a &lt;code&gt;PyCodeObject&lt;/code&gt;&lt;br&gt;
Ideally, the following elements are constructed as the internal structure of the code object.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CodeObject {
    co_consts
    co_names
    co_varnames
    co_freevars
    co_cellvars
    co_flags
    co_code
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate bytecode
&lt;/h3&gt;

&lt;p&gt;After completing syntax analysis, the Python interpreter generates bytecode from the AST.&lt;br&gt;
During this process, a source file named &lt;code&gt;compile.c&lt;/code&gt; is executed. This file implements the compiler that translates the AST into bytecode.&lt;/p&gt;

&lt;p&gt;The resulting bytecode is expressed as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt; import dis
&amp;gt;&amp;gt;&amp;gt; dis.dis('print("Hi, how are you?")')
  0           0 RESUME                   0

  1           2 PUSH_NULL
              4 LOAD_NAME                0 (print)
              6 LOAD_CONST               0 ('Hi, how are you?')
              8 CALL                     1
             16 RETURN_VALUE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This representation is close to programs written in assembly or machine language, and &lt;code&gt;LOAD_NAME 0&lt;/code&gt; corresponds to a single bytecode instruction.&lt;br&gt;
The full list of bytecode instructions can be found in &lt;code&gt;opcode.h&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From a computer science perspective, this process converts the AST into instructions for a stack machine by traversing the AST nodes.&lt;/p&gt;

&lt;p&gt;Conceptually, the following sequence of instructions is generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;co_code = [
    LOAD_NAME print
    LOAD_CONST "Hi, how are you?"
    CALL 1
    RETURN_VALUE
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Through this process, the bytecode is transformed into a form that the virtual machine can interpret directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execute the bytecode on the Python virtual machine
&lt;/h3&gt;

&lt;p&gt;As I mentioned in the section &lt;em&gt;Generate bytecode&lt;/em&gt;, the Python virtual machine is a type of &lt;strong&gt;stack machine&lt;/strong&gt;, which primarily uses a stack during calculation.&lt;br&gt;
A &lt;strong&gt;stack&lt;/strong&gt; is a data structure used to store values in such a way that new data is added on top of existing data. When data is removed, the most recently added value is taken first. This behavior is known as &lt;strong&gt;Last In, First Out(LIFO)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The bytecode generated by the Python interpreter is designed to be executed efficiently on a stack-based virtual machine.&lt;br&gt;
Below, you can see a simplified explanation of how the previously shown bytecode is executed. For clarify, some details are omitted, so this description is not perfectly precise, but it should help build intuition.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RESUME 0&lt;/td&gt;
&lt;td&gt;Represent the start of a function call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUSH_NULL&lt;/td&gt;
&lt;td&gt;Push NULL onto the stack to indicate that this is not a method call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOAD_NAME 0 (print)&lt;/td&gt;
&lt;td&gt;Push the value of the variable  &lt;code&gt;print&lt;/code&gt; onto the stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOAD_CONST 0 ('Hi, how are you?')&lt;/td&gt;
&lt;td&gt;Push the value of the variable &lt;code&gt;Hi, how are you?&lt;/code&gt; onto the stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CALL 1&lt;/td&gt;
&lt;td&gt;Pop the number of values specified by the variable &lt;code&gt;argc&lt;/code&gt; from the top of the stack, and call the corresponding callable object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETURN_VALUE&lt;/td&gt;
&lt;td&gt;Return to the original caller&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the Python virtual machine, this bytecode is executed sequentially from the top, with each instruction performing operations that push the resulting Python objects onto the stack.&lt;/p&gt;
&lt;h3&gt;
  
  
  Execute machine instructions on the CPU
&lt;/h3&gt;

&lt;p&gt;The CPU executes programs that have been loaded into memory. In the case of Python, the CPU executes the machine instructions that implement the Python virtual machine.&lt;/p&gt;

&lt;p&gt;Let me briefly explain what machine instructions are.&lt;/p&gt;

&lt;p&gt;Machine instructions represent operations using binary values composed of zeros and ones. For readability, hexadecimal notation is often used so that humans can more easily interpret them. If you are interested, you can open a &lt;code&gt;.pyc&lt;/code&gt; file using a binary editor to see this representation yourself.&lt;/p&gt;

&lt;p&gt;In the case of &lt;code&gt;test.py&lt;/code&gt;, the machine instructions would look like the following. Note that these are shown in hexadecimal for human readability and differ from the actual machine instructions executed directly by the CPU.&lt;/p&gt;

&lt;p&gt;Now, let's return to the main discussion.&lt;/p&gt;

&lt;p&gt;For example, the &lt;code&gt;CALL 1&lt;/code&gt; bytecode instruction corresponds to invoking a specific &lt;code&gt;case&lt;/code&gt; in a &lt;code&gt;switch&lt;/code&gt; statement in C, conceptually described as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;switch (opcode){
    case CALL:
    /* Call a function with the given arguments */
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To describe the entire flow precisely -- from execution on the Python virtual machine to execution on the CPU --it can be summarized as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;CALL 1&lt;/code&gt; instruction is read by CPython's C implementation, which branches to the corresponding &lt;code&gt;case CALL:&lt;/code&gt; in a switch statement. The CPU then executes the machine instructions that implement that &lt;code&gt;case CALL:&lt;/code&gt; within CPython itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the Python level, the callable function is written as &lt;code&gt;print&lt;/code&gt;. However, the actual callable object is implemented in CPython's C code, specifically as &lt;code&gt;builtin_print_impl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The above describes the complete flow of how a Python program is executed.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. What Happens When the &lt;code&gt;print&lt;/code&gt; Function Is Called?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now, let's take a closer look at the behavior of the &lt;code&gt;print&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;Briefly speaking, &lt;code&gt;print&lt;/code&gt; is not part of the standard library--it is a &lt;strong&gt;built-in function&lt;/strong&gt;. Built-in functions are implemented directly in CPython's C source code.&lt;/p&gt;

&lt;p&gt;You can find the function object for &lt;code&gt;print&lt;/code&gt; in the CPython repository &lt;a href="https://github.com/python/cpython/blob/v3.11.2/Python/bltinmodule.c#L1986" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As mentioned in the previous section, the impolementation corresponding to &lt;code&gt;print&lt;/code&gt; is &lt;code&gt;builtin_print_impl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To keep the discussion focused, I will paste the relevant part of the original source code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static PyObject *
builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep,
                   PyObject *end, PyObject *file, int flush)
/*[clinic end generated code: output=3cfc0940f5bc237b input=c143c575d24fe665]*/
{
    int i, err;

    if (file == Py_None) {
        PyThreadState *tstate = _PyThreadState_GET();
        file = _PySys_GetAttr(tstate, &amp;amp;_Py_ID(stdout));
        if (file == NULL) {
            PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
            return NULL;
        }

        /* sys.stdout may be None when FILE* stdout isn't connected */
        if (file == Py_None) {
            Py_RETURN_NONE;
        }
    }

    if (sep == Py_None) {
        sep = NULL;
    }
    else if (sep &amp;amp;&amp;amp; !PyUnicode_Check(sep)) {
        PyErr_Format(PyExc_TypeError,
                     "sep must be None or a string, not %.200s",
                     Py_TYPE(sep)-&amp;gt;tp_name);
        return NULL;
    }
    if (end == Py_None) {
        end = NULL;
    }
    else if (end &amp;amp;&amp;amp; !PyUnicode_Check(end)) {
        PyErr_Format(PyExc_TypeError,
                     "end must be None or a string, not %.200s",
                     Py_TYPE(end)-&amp;gt;tp_name);
        return NULL;
    }

    for (i = 0; i &amp;lt; PyTuple_GET_SIZE(args); i++) {
        if (i &amp;gt; 0) {
            if (sep == NULL) {
                err = PyFile_WriteString(" ", file);
            }
            else {
                err = PyFile_WriteObject(sep, file, Py_PRINT_RAW);
            }
            if (err) {
                return NULL;
            }
        }
        err = PyFile_WriteObject(PyTuple_GET_ITEM(args, i), file, Py_PRINT_RAW);
        if (err) {
            return NULL;
        }
    }

    if (end == NULL) {
        err = PyFile_WriteString("\n", file);
    }
    else {
        err = PyFile_WriteObject(end, file, Py_PRINT_RAW);
    }
    if (err) {
        return NULL;
    }

    if (flush) {
        PyObject *tmp = PyObject_CallMethodNoArgs(file, &amp;amp;_Py_ID(flush));
        if (tmp == NULL) {
            return NULL;
        }
        Py_DECREF(tmp);
    }

    Py_RETURN_NONE;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the &lt;code&gt;print&lt;/code&gt; function is called, characters are displayed on the standard output through the following sequenc of steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Execute Python source code.&lt;/li&gt;
&lt;li&gt;Compile the source code into Python bytecode.&lt;/li&gt;
&lt;li&gt;Execute the bytecode on the Cpython virtual machine.&lt;/li&gt;
&lt;li&gt;Invoke the built-in &lt;code&gt;print&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;file.write()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Call the C standard library function &lt;code&gt;write()&lt;/code&gt;.
--&lt;em&gt;The steps above are executed within the Python runtime layer&lt;/em&gt;.--&lt;/li&gt;
&lt;li&gt;Invoke a system call handled by the operating system kernel.&lt;/li&gt;
&lt;li&gt;Output the characters to the standard output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The connection between these steps and the previous sections may not be immediately clear, so before explaining each operation in detail, I will first provide some additional context.&lt;br&gt;
The steps above describe the observable behavior at a high level, while the CPU is continuously executing instructions behind the scenes.&lt;/p&gt;

&lt;p&gt;From the CPU's perspective, the steps above can be described as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While executing the machine instructions that implement the CPython  virtual machine, the CPU reaches a &lt;code&gt;CALL&lt;/code&gt; instruction and invokes the machine instructions corresponding to the built-in &lt;code&gt;print&lt;/code&gt; function. During this process, execution transitions through &lt;code&gt;PyFile_WriteObject&lt;/code&gt; to &lt;code&gt;FileIO.write&lt;/code&gt;, and finally to the &lt;code&gt;write&lt;/code&gt; system call.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Visually, the process can be illustrated as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; CPU
 └─ CPython VM（machine instructions）
      └─ builtin print（machine instructions）
           └─ PyFile_WriteObject（machine instructions）
                └─ FileIO.write（machine instructions）
                     └─ libc write（machine instructions）
                          └─ kernel write（machine instructions）
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this overview in mind, let's move on to a detailed explanation of the entire execution flow of the &lt;code&gt;print&lt;/code&gt; function.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Invoke the Built-in &lt;code&gt;print&lt;/code&gt; Function&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here, the actual callable object is defined as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static PyObject *
builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep,
                   PyObject *end, PyObject *file, int flush)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When this object is invoked, the following steps are executed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;① Receive the given arguments as &lt;code&gt;PyObject*&lt;/code&gt; values.&lt;br&gt;
② Interpret the &lt;code&gt;sep&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt;, &lt;code&gt;file&lt;/code&gt;, and &lt;code&gt;flush&lt;/code&gt; parameters.&lt;br&gt;
③ Determine the output destination (&lt;code&gt;file&lt;/code&gt;), which defaults to  &lt;code&gt;sys.stdout&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Invoke the &lt;code&gt;file.write()&lt;/code&gt; method on the output file object&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the following C implementation, the &lt;code&gt;write&lt;/code&gt; method of the Python &lt;code&gt;file&lt;/code&gt; object is invoked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PyFile_WriteObject(obj, file, Py_PRINT_RAW);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within &lt;code&gt;builtinmodule.c&lt;/code&gt;, which was introduced in the previous section, the following function corresponds to this behavior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PyFile_WriteObject(sep, file, Py_PRINT_RAW)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In effect, this is equivalent to calling &lt;code&gt;sys.stdout.write(...)&lt;/code&gt; at the Python level.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Invoke the standard library function &lt;code&gt;write()&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Python's &lt;code&gt;sys.stdout&lt;/code&gt; is composed of multiple layers of wrapper objects, as illustrated below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextIOWrapper
  └─ BufferedWriter
       └─ FileIO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The C implementation of &lt;code&gt;FileIO.write()&lt;/code&gt; is located in &lt;code&gt;Module/_io/fileio.c&lt;/code&gt;, and the function &lt;code&gt;_io_FileIO_write_impl&lt;/code&gt; provides the low-level implementation of &lt;code&gt;FileIO.write()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*[clinic input]
_io.FileIO.write
    cls: defining_class
    b: Py_buffer
    /

Write buffer b to file, return number of bytes written.

Only makes one system call, so not all of the data may be written.
The number of bytes actually written is returned.  In non-blocking mode,
returns None if the write would block.
[clinic start generated code]*/

static PyObject *
_io_FileIO_write_impl(fileio *self, PyTypeObject *cls, Py_buffer *b)
/*[clinic end generated code: output=927e25be80f3b77b input=2776314f043088f5]*/
{
    Py_ssize_t n;
    int err;

    if (self-&amp;gt;fd &amp;lt; 0)
        return err_closed();
    if (!self-&amp;gt;writable) {
        _PyIO_State *state = get_io_state_by_cls(cls);
        return err_mode(state, "writing");
    }

    n = _Py_write(self-&amp;gt;fd, b-&amp;gt;buf, b-&amp;gt;len);
    /* copy errno because PyBuffer_Release() can indirectly modify it */
    err = errno;

    if (n &amp;lt; 0) {
        if (err == EAGAIN) {
            PyErr_Clear();
            Py_RETURN_NONE;
        }
        return NULL;
    }

    return PyLong_FromSsize_t(n);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;a href="https://github.com/python/cpython/blob/main/Modules/_io/fileio.c" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The function prototype is shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_Py_write(fd, buf, size)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this level, execution transitions from the Python layer to the C I/O layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Invoke a System Call Handled by the Operating System Kernel.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the entire execution of the &lt;code&gt;print&lt;/code&gt; function, this step is the most expensive.&lt;br&gt;
During a system call, the following operations occur:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;① Transition from user space to kernel space.&lt;br&gt;
② Perform a context switch.&lt;br&gt;
③ Write to standard output within the operating system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Transition from User Space to Kernel Space&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This step means that the CPU switches its execution mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User space&lt;/strong&gt; is where ordinary applications, such as Python programs, CPython itself and standard libraries, run. Code in user space cannot directly access hardware devices or protected memory.&lt;br&gt;
&lt;strong&gt;Kernel space&lt;/strong&gt; is where the operating system runs. Device operations, file I/O and process management are handled in this space.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;print&lt;/code&gt; function must transition from user space to kernel space in order to perform device-related operations. You can think of this transition as occurring when a system call, such as &lt;code&gt;write()&lt;/code&gt;, is invoked.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Perform a Context Switch&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This step means that the CPU switches its execution context.&lt;/p&gt;

&lt;p&gt;There are two types of context switches. One is (A) a transition from user mode to kernel mode, as described above. The other is (B) a process switch, where the CPU switches from one process to another. In the case of the &lt;code&gt;print&lt;/code&gt; function, the important context switch is (A).&lt;/p&gt;

&lt;p&gt;This mode transition caused by a system call is the primary reason why I/O operations are expensive.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;The Operating System Handles Standard Output&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Briefly speaking, this step sends an instruction to the operating system that says, &lt;em&gt;"Write these characters to the file descriptor whose value is 1."&lt;/em&gt;&lt;br&gt;
(File descriptor &lt;code&gt;1&lt;/code&gt; corresponds to standard output.)&lt;/p&gt;

&lt;p&gt;Conceptually, standard output is processed as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Execute sys_write(fd=1, buf)
  ↓
Resolve the file descriptor to an internal file structure
  ↓
Route the output to the corresponding device, file, or pipe
  ↓
Apply buffering if necessary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To summarize this flow more simply: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When &lt;code&gt;print()&lt;/code&gt; is called, CPython invokes &lt;code&gt;write()&lt;/code&gt;, which switches the CPU execution mode from user mode to kernel mode.&lt;br&gt;
The operating system then resolves the file descriptor with value &lt;code&gt;1&lt;/code&gt; (standard output) and writes the data to the appropriate destination, such as a terminal, file, or pipe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These kernel-level operations and device I/O are significantly more expensive than the mode switch itself, which is why frequent calls to &lt;code&gt;print()&lt;/code&gt; can easily become a performance bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Output Characters To the Standard Output&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The kernel sends the characters to the appropriate output destination , which in this case is the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. The Cause of the TLE: Calling &lt;code&gt;print&lt;/code&gt; Inside a &lt;code&gt;for&lt;/code&gt; Loop&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First of all, thank you for staying with me up to this point.&lt;/p&gt;

&lt;p&gt;As stated in the heading, the cause of the TLE I encountered was the repeated use of the &lt;code&gt;print&lt;/code&gt; function inside a &lt;code&gt;for&lt;/code&gt; loop.&lt;/p&gt;

&lt;p&gt;More precisely, the implementation introduced in the first chapter, which is described below, triggers a TLE because &lt;code&gt;print&lt;/code&gt; is executed on every iteration of the loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for i in range(n):
    print("prime" if is_prime(arr[i]) else "not prime")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each time the loop variable 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ii &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 is incremented by &lt;code&gt;1&lt;/code&gt;, the &lt;code&gt;print&lt;/code&gt; function is called.&lt;/p&gt;

&lt;p&gt;As explained throughout this article, calling &lt;code&gt;print&lt;/code&gt; involves kernel-level operations and device I/O. Executing these expensive operations on every iteration significantly degrades performance.&lt;/p&gt;

&lt;p&gt;For example, when the maximum input value of 380,000 is provided, the &lt;code&gt;print()&lt;/code&gt; function is invoked 380,000 times.&lt;br&gt;
This workload is simply too heavy for the CPU and the operating system to handle efficiently.&lt;/p&gt;

&lt;p&gt;This example clearly demonstrates that--even when using an efficient algorithm--an inappropriate implementation choice can lead to disastrous performance under the given input constraints.&lt;/p&gt;

&lt;p&gt;Now, let's take another look at the revised program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;out = []
for x in arr:
    out.append("prime" if is_prime_table[x] else "not prime")

print("\n".join(out))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No matter how large the input value is, collecting the output values in an array results in calling the &lt;code&gt;print&lt;/code&gt; function only once. When you compare a single call to &lt;code&gt;print&lt;/code&gt; with 380,000 calls, the difference in CPU workload becomes immediately clear.&lt;/p&gt;

&lt;p&gt;This experience taught me an important lesson: &lt;strong&gt;when you encounter a TLE despite using an efficient algorithm, suspect I/O operations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I hope this article has helped you gain a deeper understanding of what happens behind the scenes and why such performance issues occur.&lt;/p&gt;




&lt;p&gt;If you find any mistakes, please let me know through the feedback form. I will revise them as quickly as possible.&lt;/p&gt;

&lt;p&gt;See you again in the next article!&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Implementing Shell Sort: From Theory to Practical Code</title>
      <dc:creator>yumyum116</dc:creator>
      <pubDate>Sat, 03 Jan 2026 08:19:26 +0000</pubDate>
      <link>https://dev.to/yumyum116/implementing-shell-sort-from-theory-to-practical-code-5bce</link>
      <guid>https://dev.to/yumyum116/implementing-shell-sort-from-theory-to-practical-code-5bce</guid>
      <description>&lt;p&gt;This article is part of a series focused on translating algorithmic theory into practical code implementations.&lt;/p&gt;

&lt;p&gt;I am glad if this blog helps beginners, or those transitioning their careers into software engineering, take a step forward.&lt;/p&gt;

&lt;p&gt;In this article, I implement &lt;strong&gt;Shell sort&lt;/strong&gt;, one of the more efficient sorting algorithms, using multiple approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is shell sort?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Shell sort is an improvement over insertion sort, which is one of the fundamental sorting algorithms. Insertion sort compares and inserts adjacent elements in a given array.&lt;/p&gt;

&lt;p&gt;By contrast, Shell sort repeatedly performs insertion-like operations on elements that are separated by a fixed gap, gradually reducing the gap size. Eventually, when the gap becomes 1, the algorithm behaves exactly like insertion sort.&lt;/p&gt;

&lt;p&gt;This raised an important question: is Shell sort ultimately becomes insertion sort, where does the improvement come from?&lt;/p&gt;

&lt;p&gt;Before diving into the main discussion, let me briefly introduce some background.&lt;/p&gt;

&lt;p&gt;There are two common measures used to evaluate algorithm performance: time complexity and space complexity. In this article, I will not explain these concepts in detail; instead, I will refer to them using 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Big−OBig-O &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;B&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 notation, which expresses their behavior mathematically.&lt;/p&gt;

&lt;p&gt;For an input size of 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, the time complexity of insertion sort ranges from 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n2)O(n^2) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n)O(n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;

&lt;p&gt;In contrast, Shell sort improves to about 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n1.3)O(n^{1.3})&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(nlogn)O(nlogn) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, depending on the gap sequence used.&lt;/p&gt;

&lt;p&gt;If you are interested in how the time complexity are derived, I recommend reading &lt;a href="https://amzn.to/3YkRT4J" rel="noopener noreferrer"&gt;Introduction to Algorithms&lt;/a&gt;. In practice, the difference in performance becomes noticeable when the input size exceeds around 1,000 elements.&lt;/p&gt;

&lt;p&gt;Let us consider the following concrete problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are given the integer scores of 10,000 engineers, arranged in random order.&lt;/p&gt;

&lt;p&gt;Write a program that pairs engineers whose scores are close to each other.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One possible approach is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sort the engineers by score&lt;/li&gt;
&lt;li&gt;Pair adjacent elements in the sorted list&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If insertion sort is used for step 1, the number of operations can reach &lt;strong&gt;up to one billion in the worst case&lt;/strong&gt;, since its worst-case time complexity is 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n2)O(n^2) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;

&lt;p&gt;By contrast, when Shell sort is applied, the average time complexity improves to approximately 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n1.3)O(n^{1.3}) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(nlogn)O(nlogn) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, depending on the gap sequences.&lt;/p&gt;

&lt;p&gt;As you may notice, &lt;strong&gt;Shell sort is designed to address the inefficiency of insertion sort, particularly when dealing with large input sizes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shell sort Approach
&lt;/h2&gt;

&lt;p&gt;Before I explain the shell sort method, let me first describe how insertion sort works.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Insertion sort approach&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;For each index 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ii &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 from 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;11 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;n−1n - 1 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, insert element 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AiA_i &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 into the sorted position of the array.&lt;/li&gt;
&lt;li&gt;Store the value of 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AiA_i &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 in a temporary variable 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xx &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;li&gt;While 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Aj&amp;gt;xA_j &amp;gt; x &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, shift 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AjA_j &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 one position to the right.&lt;/li&gt;
&lt;li&gt;Insert 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xx &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 into 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Aj+1A_{j+1} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Insertion sort can be viewed as a special case of Shell sort where the gap size is 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;11 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;

&lt;p&gt;Therefore, a generalized version of insertion sort naturally leads to the Shell sort algorithm.&lt;/p&gt;

&lt;p&gt;In more detail, the approach can be extended as follows:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Shell Sort Approach&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Choose an initial gap value 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;gg &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;li&gt;For each index  
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ii &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 from 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;gg &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;n−1n - 1 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, insert element 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AiA_i &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 into its correct position among elements spaced 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;gg &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 apart.&lt;/li&gt;
&lt;li&gt;Store the value of 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AiA_i &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 in a temporary variable 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xx &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;li&gt;While 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Aj&amp;gt;xA_j &amp;gt; x &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, shift 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;AjA_j &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Aj+gA_{j+g} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;li&gt;Insert 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;xx &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 into 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Aj+gA_{j+g} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;j&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;li&gt;Iterate steps 2-5 while gradually reducing the gap until it becomes 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;11 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the next section, I will implement this approach in practical code.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Implementation of shell sort&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pattern 1: Gap Sequence Provided as Input&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Store the value of A[i] in a temporary variable x
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Shift A[j] to A[j+gap]
&lt;/span&gt;            &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;

        &lt;span class="c1"&gt;# Insert x into A[j+gap]
&lt;/span&gt;        &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;shell_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;, where $n$ denotes the number of elements in the array.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pattern 2: Gap Sequence Generated Within the Algorithm&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Store the value of A[i] in a temporary variable x
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Shift A[j] to A[j+gap]
&lt;/span&gt;            &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;

        &lt;span class="c1"&gt;# Insert x into A[j+gap]
&lt;/span&gt;        &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;    &lt;span class="nf"&gt;shell_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Create an array to store the gap values.
&lt;/span&gt;    &lt;span class="n"&gt;gap_sequence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="c1"&gt;# Initialize the first gap as n // 2
&lt;/span&gt;    &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Gradually reduce the gap until it reaches 1.
&lt;/span&gt;        &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;//=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;gap_sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;This is concludes the article.&lt;/p&gt;

&lt;p&gt;As a final note, the optimal gap sequence for Shell sort remains an open problem.&lt;br&gt;
If you are interested in this topic, you may find it rewarding to explore how different gap sequences perform across various datasets.&lt;/p&gt;

&lt;p&gt;If you notice any mistakes, including typos, I would be happy to revise them.&lt;br&gt;
Please feel free to share your feedback through the contact form.&lt;/p&gt;

&lt;p&gt;See you in the next article 👋&lt;/p&gt;

</description>
      <category>shellsort</category>
      <category>python</category>
    </item>
  </channel>
</rss>
