cpython_growth.csvという、36年間にわたるCPythonのコミット履歴から1400件弱を抽出し、その時点でのソースコードの行数を記録したデータセットがあります。今回はこのデータセットを少しばかり眺めてみましょう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
どうもHPかわさきです。
ある日、こんなブログ記事を見つけました。
内容を簡単にまとめると「CPythonのソースコードがどんな調子で増えていったのかを表すデータセットを作ったよ」というお話です。というわけで、今回は自分ではコードを書かずにClaude Cowork(以下、Cowork)と一緒に、このデータセットをいじくってみることにしました。
「1990年にはGitHubなんてないけど、どうなっているの?」というのは分かっています。が、Pythonのソースコードのバージョン管理は何度かの変更を経て、現在はGitHub(Git)で行われています。そして、過去のコミット履歴も参照可能なように引き継がれてきたことに感謝しながら、データセットを眺めてみましょう。
このデータセットはcpython_growth.csvというもので、先に述べたブログ記事で紹介されているものです。これをダウンロードして、適当なフォルダに放り込んで、Coworkにその概要を調べてもらいました。
その結果、次のようなことが分かりました。
また、「1コミット=1行ではない」というのも重要です。1つのコミットについて、そのコミットが行われた時点での行数の合計(言語種別:SUM)と、言語別の行数(C/C++、Pythonなど)が複数行にわたって記述されています(これはclocというツールを使っているとのこと)。
36年間にわたるCPythonのソースコードに対する大量のコミットから1392件を抽出し、コミット時点でのソースコードの行数をまとめたものが本データセットということです(抽出の基準まではちょっと分からないのですが)。
これをスタート地点として、Pythonのコード量についていろいろ考えていきましょう。ただし、その前に気を付けてください。このデータセットからは、CPythonのコードベースがどの時期に、どの種類のファイルを増やしながら膨らんできたのかは分かります。でも、その増減がなぜ起きたのかまでは、このCSVでは見えません。どのコミットによってコードが増減の原因だったのか、行数の変化が機能追加を意味するのか、単なる移行や整理なのかまでは、このCSVだけでは分からないのです。つまり、「現象」は見えますが、「原因」までは見えないのです。そこで役立つのがCoworkということですね。
あるあるでしょうが、「言語ごとのコード量の増加」をまずは可視化してもらいました。入力したのは「まずは各言語の行数の増加をグラフにしてください。主要な言語のみで構わないです」というプロンプトです。
横軸は日付ですが、コミット日に各言語のコード行の数を打点し、それらを直線でつないだものです。へー、増えていく一方かと思ったらそうでもないんですね。ガクッとコード量が減っている箇所もあります。
実はその後にCoworkとやりとりしていく中で、同じファイル名でグラフを上書きしてくれちゃったので、これは後から再作成してもらったものです。
筆者が気になったのはグラフの下にある茶色の線(TeX)です。ある時期を境に急降下しています。と同時に、赤い線(reStructuredText。以下reST)が垂直に立ち上がって以降は徐々に行数を増やしています。
それから、このグラフにPythonの各バージョンのリリース日が含まれていると、何かが分かるかもしれません。この2点をCoworkとの対話を重ねながらグラフに入れ込んでもらいました。その結果が以下のグラフです。
先ほどはTeXのグラフは右肩下がりに急降下でしたが、今度のグラフでは急降下どころか垂直落下に変わっています。これはデータセットの作り方が原因ともいえます。LaTeXからreSTへの移行で、一度はLaTeXのコードがリポジトリからは完全になくなってしまいました。しかし、2010年に少量のLaTeX(もしくはTeX)のコードが復活したのです。この間に行われたコミットに関するデータには、言語種別TeXのエントリは一切含まれないのです。
当初はこのことをちゃんと理解していなかったため、Coworkは10万行超から4000行程度へと斜めに落ちていくグラフをプロットしてしまいました。その後、この点を踏まえて、グラフを書き直してもらうと、実態に近い垂直落下の形のグラフになったのです。
対して、Pythonバージョンとコード量の関係はよく分かりませんでした。気になる点は幾つかあります。2000年を過ぎた辺りで突然増加して、その少し後に突然減少しているところや、2010年の少し前にある突然の減少、2010年を過ぎたところ(Python 3.2のリリースと同時期)の増加など。これらについては後で聞いてみることにしましょう。
次にコード量の増加を積み上げ面グラフにしてもらいました。全体のコード量の中で各言語がどれほどのボリュームを持っているかを示すものですね。
よくある感じのグラフになりました。C関連のコードとPythonのコードが着実に増えていることがよく分かります。1990年代初頭はCのコードが大半だったところ、徐々にPythonで書かれたコードも増えてきて、どこかの時点でPythonの行数がCの行数を追い越し、現在でもPythonコードの方がCコードよりも多い状態が続いています。
では、Pythonのコードの行数がCのコードの行数を超えたのはいつでしょう。Coworkに調べてもらいました。答えは次のようなものでした。
では、何か増加の要因として考えられるのでしょう。筆者が「うーん」となって、「ピコーン! モジュール数に目を付けてみたらどうだろう」と思い付いて、作ってもらったのが以下のグラフです。
グラフにあるモジュール数は各バージョンの標準ライブラリを列挙するページ(例えば、Python 3.14の「Python Module Index」ページ)で数えています。が、あくまでも概算です。
Python 3.10からはsysモジュールのstdlib_module_names属性(frozenset)に標準ライブラリの名前が一覧されています。Python 3.14でこの属性の要素数を調べると297個となりました。これに対して、Coworkが上記ページから算出したのは315個とのこと。後者には下位モジュールやサブパッケージも含まれているからでしょう。このように誤差があることはご承知おきください。
うん。これを見ると、Pythonのコード量の増加とモジュール数には大きな関係はなさそうです。となると、何が原因でしょうか。Coworkによれば、大規模なモジュール(asyncioやpathlibなど)が追加されたことや、CとPythonの両者のコードで実装されているモジュール(datetimeなど)、ドキュメント文字列の充実化、ツール類の拡充などが、Pythonのコード量増加の要因として考えられるとのことです。ソースコードの森に踏み入らなければ、これについては正確なところは分からないのでしょうねぇ(踏み入ったところで、分かるとも思えませんが)。
先ほど、コード量の増減について幾つか気になる点があるといいました。
これらについて該当部分のコミットIDを取得して、それを基にClaude in Chromeを使ってCPythonのリポジトリからコミットメッセージを見てみる、というのを基本的な方針として原因を調べてみました。
結果は次の通りです。
と書くのは簡単なのですが、Coworkさんといえども、これにたどり着くのは簡単ではありませんでした。まず、「すぐにリミットに当たっちゃう」ことがあります。
湯水のようにトークンを使いたい(笑)。
それから、「cpython_growth.csvファイルはPythonの全コミットを記録したものではなく、データセットの作成者が何らかの基準で選んだコミットに関する記録をまとめたものである」点にも考慮する必要があります。
例えば、上記の2にある「2007年ころにCのコードがガクンと減少している」状況を記録した行で記録されているコミットと、実際にCコードをガクンと減らしたコミットは別モノでした。こうなると、該当のコミットとその直前に記録されているコミットの日付の間になされたコミットを探して、原因となりそうなものを探す必要が出てきます。湯水のようにトークンを使えれば、Claude in Chromeに任せて力業で原因を究明することも可能でしょうが、なかなかそうもいきません。
実際はどうだったかというと、筆者が人力でCPythonのリポジトリで日付の範囲指定と「remove」という語句を指定して、コミットを検索し、その結果をCoworkに渡すという謎の連係プレーをすることになりました。
人が指示を出した上で、生成AIの下請けまでやることに(笑)。でも、結局、今の段階では、生成AIが活躍できるように、人がうまく立ち回ってやる必要があるということですねぇ。
月次でのコミット数を集計することで、Pythonを取り巻く環境がどのくらい活発だったのかも検討できるかもしれません(でも、やっぱりどういう基準でコミットが抽出されているのかが分からないから、当て推量にしかならないかなぁ)。
というわけで、Coworkのリミットにそろそろヒットしちゃいそうになってきたので、この辺りで終わりにしたいと思います。あんまりよい知見が得られていないのですが、興味のある方は、cpython_growth.csvをダウンロードして、ご自分でもCoworkなり、他のチャットボットなりを使って、いじってみると何かの発見があるかもしれませんよ!
Copyright© Digital Advantage Corp. All Rights Reserved.
編集部からのお知らせ