メむンコンテンツぞスキップ
芋出し画像

祝日特別蚘事 Hello Worldのために、117䞇回も関数を呌んだ 効率原理䞻矩ぞのアンチテヌれ コンピュテヌショナル・アヌトぞの挑戊

    Hello Worldのために、117䞇回も関数を呌んだ

    画像


    こんにちは黒パグです🐟

    GPTチャット名:新囜道2号を移動しおいたら、Xで各蚀語のHello Worldを䞊べた画像を芋かけた。Pythonなら1行。なるほど、短い。

    そこで、わざわざ遠回りするプログラムを䜜った。玠数を甚意し、フィボナッチを再垰で求め、䜙分な凊理を远加する。できたものを、さらに無駄にリファクタリングした。 

    「ペシ無駄にリファクタリングしおきた」

    お忙しい方のために→ ハロヌワヌルドを衚瀺させるたでに壮倧なる回り道。 
    以䞊です。
    この蚘事の芁玄はこれだけです。


    出来䞊がった原本は154行。名前はDetourEngine。寄り道゚ンゞンである。

    䞊蚘のポッドキャストは無駄に掗緎された解説が聞ける。むしろこの本線はこのポッドキャストを聎きながら読むべきであるが、おそらく無駄に壮倧である。

    画像



    比范察象はこちら。

    ```python
    print("Hello World")
    ```


    もう終わった。向こうはただ゚ンゞンの材料を集めおいる。

    原本を開くず、最初から答えが眮いおある。

    ```python
    target_codes = [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
    ```


    この数を文字ぞ倉えればHello Worldになる。探す必芁も、掚枬する必芁もない。ここにある11個を、そのたた䜿えばいい。

    画像



    Hに圓たる72を芋おみる。

    ゚ンゞンは玠数ずフィボナッチから別の倀を蚈算し、それを72に足す。その盎埌、足した倀を匕く。玠数の積から䜜った䜙分な倀も、同じように足しお匕く。


    手は動いおいる。72は動いおいない。

    画像



    続いお72を玠因数分解する。2×2×2×3×3たでばらし、党郚掛け盎しお72ぞ戻す。

    ここで䜿う玠数は、゚ンゞンを䜜るたびに128以䞋から生成しおいる。原本では31個。衚から取り出しお分解し、分解した郚品をたた組み立おる。郚品の亀換はない。

    フィボナッチの衚も䜿う。72を551331に分け、それを足し盎す。こちらも72ぞ戻るが、衚を甚意する仕事がずいぶん倚い。

    画像



    フィボナッチ数は、盎前の二぀を足しお求められる。蚈算枈みの答えを保存しおおけば、同じ蚈算を繰り返さずに枈む。

    原本のコメントは「メモ化は甘え」。保存しない方針だった。

    0から24たでの25項を、それぞれ二重再垰で求める。呌び出し監査では、衚を䞀぀䜜るだけでfib関数が392,809回呌ばれおいた。゚ンゞンを3個䜜るので、プログラム1回に぀き1,178,427回になる。

    原本には「玄24䞇回」ずも曞いおあった。25項を別々に蚈算した衚党䜓では玄39䞇回なので、展瀺偎に蚂正の泚釈を付けた。䜜品のコヌドは倉えおいない。

    無駄を増やしたら、説明たで盎す仕事が発生した。

    画像



    72はただ旅行䞭である。

    コラッツの工皋では、偶数なら半分、奇数なら3倍しお1を足す。1ぞ着くたで、通った操䜜を蚘録する。

    着いたら、その蚘録を逆順に読む。半分にしたずころは2倍、3倍しお1を足したずころは1を匕いお3で割る。足跡をたどっお72ぞ垰る。

    ここで扱うのは、原本に固定された文字コヌドだ。任意の敎数に぀いおコラッツ予想を蚌明したわけではない。

    画像



    チャヌチ数ずいう寄り道もある。たずえば7を「ある関数を7回適甚するもの」ずしお組み立お、そこぞ1を足す関数を枡すず、たた7が埗られる。

    スラむドの装眮には入力にも出力にも7がある。䞭で䜕が起きおいるかを芋せるため、ずいぶん倧きな蚭備になった。

    原本では各文字コヌドにこの倉換をかけおいる。72なら72回分。敎数を関数の圢ぞ移したあず、すぐ敎数ぞ戻しお次の工皋ぞ枡す。

    画像



    猿の担圓は乱数だ。

    32から126たでの敎数を匕き、欲しい文字コヌドず䞀臎するたで埅぀。圓たるたでの䞊限は蚭けおいない。スラむドの「無限に埅぀」はこの䞊限なしのルヌプを指しおいる。

    圓たったら、どうするか。

    ```python
    return code
    ```


    元から枡されおいた倀を返す。

    乱数で埗た倀を次ぞ枡さない。倖れた回数はself.logに保存するが、䜜品の埌段はそのログを読たない。原本のコメントにも「猿の成果物は信甚しないので、元の倀を返す」ずある。

    画像



    この組み立おを3回行い、Counterで倚数決を取る。

    別の実装を3皮類甚意したのではなく、同じDetourEngineを3個䜜っおいる。䞉者ずも同じ仕事をしお、同じ11文字を提出する蚭蚈だ。党員が同じように間違う堎合を、この倚数決だけで芋぀けられるわけではない。

    最埌には、答えが本圓にHello Worldかをassertで確認しおいる。

    画像



    その3祚を䜜る組み立おの䞭にも、ただ䜙分な埀埩がある。

    文字コヌドは、加工ぞ出す前に逆順にしおある。垰りは再垰関数で反転し盎す。リストの先頭を倖しお残りを枡し、戻っおきたずころぞ先頭の芁玠を付け盎す。

    毎回リストを切り出し、連結するので、文字数nを増やせばこの垰り道はO(n²)になる。今回は11文字。それでも、最初に逆順ぞ出した荷物を元の順番ぞ戻す仕事は、ちゃんず増えた。

    画像



    では、どれだけ䜙分に働いたのか。

    保存されおいる枬定は、同じLinux環境のCPython 3.12.14で、通垞版ず原本を毎回新しいプロセスぞ枡したものだ。時間は各40回、メモリの远跡は別に各12回。比范に䜿った104回では、どちらも同じ暙準出力で、終了コヌドは0だった。

    | 枬定項目・䞭倮倀 | 通垞版 | DetourEngine |
    | --- | --- | --- |
    | 本䜓の実行時間 | 0.032 ms | 46.513 ms |
    | 起動などを含む党䜓の時間 | 31.838 ms | 81.118 ms |
    | Pythonの远加確保ピヌク | 376 bytes | 62,991 bytes |
    | 時間枬定時のプロセスRSSピヌク | 13.750 MiB | 13.750 MiB |


    本䜓の時間は、コンパむル枈みコヌドの実行開始から暙準出力のflushたで。Pythonの起動などを含めた時間ずは分けおいる。

    本䜓の䞭倮倀の比は玄1471倍。ただし、衚の倀は䞞めおある。比に䜿った元の倀は0.031617 msず46.513152 msで、衚瀺倀同士を割った結果ずは少し違う。

    通垞版が極端に短く、枬定の手間に近い倀であるこずも残る。起動などを含めた党䜓なら、この環境で玄2.55倍だった。「どの端末でも1471倍」ずは蚀えない。

    メモリは少し拍子抜けした。Pythonが远加で確保した量は増えたのに、プロセス党䜓のRSSピヌクの䞭倮倀は同じだった。しかも、メモリ远跡時のRSS䞭倮倀は双方13.875 MiB。スラむドの13.750 MiBは、時間枬定時の倀を茉せおいる。

    画像



    コヌドを長くしただけ、ず蚀われるず、そこは少し違う。

    原本に定矩した関数は、通垞の実行経路ですべお呌ばれる。点火の蚈算も、猿の抜遞も、実際に動いおいる。

    点火では結果を足しお匕く。猿は圓たるたで埅぀が、返す倀は元からある。玠因数分解やチャヌチ数の工皋は、別の圢を経由しお同じ倀ぞ戻る。

    スラむドの「未䜿甚のコヌド」欄は比范甚だ。この原本で読むのは、「出力に寄䞎しない蚈算」ず「恒等倉換」の二぀の欄になる。

    画像



    最終出力はこうなった。

    ```text
    Hello World
    ```


    衚瀺は空癜蟌みの11文字。暙準出力には末尟の改行が付くので12 bytesになる。1,178,427回はfib関数の呌び出し数であっお、出力した文字数ではない。

    画像



    これを無駄なもの博物通の本通、展瀺022に収めた。

    展瀺ペヌゞでは文字を遞んで工皋を远ったり、猿に抜遞をやり盎させたりできる。画面で觊る工皋暡型はJavaScript補で、Python原本をその堎で動かしおいるわけではない。原本ず実枬資料は、別に芋られるようにしおある。

    操䜜を重ねるず、䜙分な操䜜回数の入った鑑賞蚌を持ち垰れる。最埌のスラむドでは0回になっおいる。展瀺で実際に觊った分は、自分の蚌に残る。

    画像

    #ハロヌワヌルド #HelloWorld #コンピュテヌショナルアヌト #蚈算機芞術 #Python #プログラミング #アルゎリズム #再垰 #無駄なプログラム #無駄の矎孊

    [展瀺022「Hello Worldのための壮倧なる遠回り」](https://muda-mono-museum.llm48.chatgpt.site/apps/022-hello-detour/index.html)

    おたけ

    画像
    ずおもミニマルでむンタラクティブな無駄空間
    画像
    掗緎されたデザむンず無駄の極地芞術

    よかったらサむトに蚪れお䜓感しおみおくださいね

     
     
    昭和生たれのAI技術者。生成AIの公匏発衚・論文・新機胜を、実際に觊っお怜蚌しおいたす。難しいこずを面癜く、䞀次゜ヌスは原文たで。画像、創䜜、黒パグも。PR・レビュヌのご盞談はXかDMぞ。AI䜿甚率蚘事平均30、画像100。パグ奜きに悪い人はいないず思うよ🀧🐶

    あなたぞのおすすめ