CodonとMojo

個人的にPythonで最近大きなトピックだなと思ったのは、 CodonMojoの登場でしょうか。

要は「Pythonと互換性のある処理系」の登場です。前者はMIT発ベンチャー、後者はLLVM作者のベンチャー。 Pythonって個人的に三項演算子とか内包表記、何より型とインポート!!の構造が好きじゃないんですが、 一般の人がみんな思ってるのは、実際AIとかビッグデータで流行ってるのにPure Pythonはパフォーマンスが残念、という問題だと思います。 で、速くしつつ静的な型付けっぽくしてコンパイラで解決、というのが両者のアプローチ。

印象としては前者はCを少し意識する必要があるPython、後者はRust風Pythonって感じでしょうか。どっちもまだまだ実験的という感じがします。 前者はBSLだし、後者はまだまだ仕様が謎で全くスーパーセットにはなってない。 何よりPythonの魅力って自分はほぼライブラリしかないのだと思うけど、その辺りの扱いはかなり弱め。 でも、どっちもビジネスとしてこれから展開していきたいベンチャーが作った、というのは興味深いトレンドですよね。今後の発展は面白いことになるかもしれないなと思います。

Codonを試す

と言うことで、とりあえずCodon触ってみました。

WindowsにCodonは対応してません。が、Dockerによって実行可能です。 Debian系実行環境にC・C++のビルド環境と圧縮系のパッケージが必要です。

FROM python:slim-bullseye

RUN apt update && apt install -y curl build-essential libz-dev zstd && \
  /bin/bash -c "$(curl -fsSL https://exaloop.io/install.sh)" && \
  pip install codon-jit

WORKDIR /app

ENV PATH $PATH:/root/.codon/bin

CMD ["/bin/bash"]

で、codon run main.pypython main.pyを実行してみてどっちもOKかチェック。

実際のところ、codonの本領は限りなくC++に近い速度の実行ファイルが作成できることです(Pythonも後発言語みたいにPyInstaller使わずつければいいのに)。また、WASMをターゲットにできるのも強みだと思います。 が、実際はJITで使うユースケースのほうが扱いやすいと思います。 なので、今回はJITの性能を試してみました。

def performance(prefix: str):
    def _performance(fn):
        def wrapper(*args, **kwargs):
            s = time()
            res = fn(*args, **kwargs)
            e = time()
            print(f'{prefix}: {e - s} seconds')
            return res
        return wrapper
    return _performance

@performance("python")
def calc_sum(repeat: int) -> int:
    total = [x for x in range(1, abs(repeat))]
    return sum(total)

@jit
def calc_sum_jit(repeat: int) -> int:
    total = [x for x in range(1, abs(repeat))]
    return sum(total)

@performance("jit")
def exec_calc_sum_jit(repeat: int) -> None:
    calc_sum_jit(repeat=repeat)

n = 100000000
exec_get_sum_jit(n)
get_sum(n)

結果は以下。大量の計算を平然と行うやつだと、Codonにグルーすることで効率が良いわけですね。 これ自体は単純な処理なのですが、これより桁を落とすと、Pure Python(ただしパフォーマンスが大分向上した3.11版)が勝ちました。 単純な処理とかなら、普通のPythonで良いのかなあと思いますが、アルゴリズムまわりやオーダーが多い処理を敢えてゴリ押しするみたいな用途には結構使えるかもしれません

jit: 0.7782044410705566 seconds
python: 5.6476500034332275 seconds

最近の興味

やはり年初のChatGPTの登場からAGIへの志向トレンドっていうのは本当に興味があって、 BardとOpen Assistant+Hugging Chatという勢力の登場はいよいよLLMによる検索から質問への移行時代が始まったかもしれない、と感じます。 最近はChatGPTやGithub Copilotの公式導入をプレスリリースで堂々と行う企業すら存在し、公官庁も力を入れています。 特に公官庁が力を入れているという事実は、結構AGI分野は日本だと伸びるかもしれませんね。

そんな中でLang ChainやLlama Index、C#勢からは本丸MSのSemantic Kernelが出ているわけですが、個人的に注目してるのはLang Chainです。 つい最近までOpen AIの完全な一択だった訳ですが、あれこれと生えるものが生えてきた現在だと、 それなりの色々なツールチェーンを共通インターフェースでカバーするのは予言的で面白い、と感じます。 特にベクトル化インデックスの作成は明白にこれからのAI系アプリで重要な技術になってくるのではと予感させられました。 色々学んでみたいですね。

あとはDiscordを最近やるようになって、随分SNS離れしていましたが復帰しました笑
日本だと会社ではSlackって人が多いけど、オープンコミュニティだとDiscordに移行がどんどん進んでる感じがあるし、海外のコミュニケーションベースって数年前からほぼDiscordなんですよね。最近だとZulipとかもあるけど。

結構ネットで話せるというのは、良いですね。随分とこういうネット社会から離れてたので、学生の頃を思い出します。 Botとか作ってみたいかなあとか思ったり。