静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


今あえて書く、目的別Pythonを使うメリット・デメリット

はじめに

 ここ数年間、日本国内のPython事情は急速に変わったと思います。私が使い始めた4年前と比べても、ずいぶん垢抜けた感じになったというのが正直な感想です。

  • Python2からPython3への移行が(ようやく)進み、扱いやすくなった
  • ライブラリも良いものが増えたり、使いやすくなったりした
  • 解説記事などもずいぶん増えて、やりやすくなった
  • 古くからの用途であるデータサイエンス、機械学習に代わって、プログラミング初心者の勉強用言語として選択する人が増えた

 というあたりが実情でしょうか。Pythonの急拡大を支えたAIバブルには陰りが見えてきた感もなくはありませんが、Python自体は一定の地位を確保しつつある感じがして、蛇使い*1としては嬉しい限りです。

 こういう時期だからこそ、客観性を心がけつつ主観混じり的に見て「Pythonは良いのか、悪いのか」を少し書いておこうと思います。

 Python言語全般についてというのは漠然としすぎなので、用途別に書きます。長い記事なので、時間のあるときに興味のあるセクションだけお読みください。

Web

 Webで使うのはあまり流行ってないし、正直(特に国内では)たぶん流行らない。以上。

 Pythonは要するに普通のLLなので、なかなかPythonならではのメリットというのは見出しづらいのが実情でしょう。この分野はPHPやNode.jsなどが強すぎるし、それ以外に強いやつもたくさんいるので*2、積極的にPythonを選ぶシチュエーションは正直思いつきません。少なくとも、Web開発を勉強したいという人が最初に勉強するべき言語ではないと思います。

 ちょっと擁護しておくとすれば、「それなりに良い(であろう)実用的なフレームワークは揃っている」「Pythonを使える人にとっては、書きやすい」という側面はあるので、いつのまにか蛇使いになっていたという人がWebを勉強したくなったときにはDjangoやFlaskが助けてくれることでしょう。ニッチな需要もいろいろあると思いますし、絶対ダメというほどでもありません。

 いずれにせよ、Pythonは「Web分野のトップランナー」という感じではないです。勝手な想像ですが、先頭集団の末尾くらいのポジションだと思います。扱いに困ります。

いわゆる「アプリケーション」(スマホアプリ、PCのデスクトップアプリケーションなど)。あるいはゲームなど

 スマホアプリははっきり言って論外。実用的なものを作る方法はほぼないと思います(まったくないとも言い切れないのが苦々しいところですが、あえてこう書きます)。

 デスクトップアプリケーションですが、作れなくはないです。しかし、もっと向いている言語がいろいろある(windows向けならC#あたりでいいでしょう)ので、Pythonでやろうというのはかなりの変人の選択です。

 やはりPythonはスクリプト言語なので、どうやって単一exeにして持っていくか(あるいは相手のPCにPythonをインストールさせるのか)というところで躓きます。単一exeにする場合、どうしても起動が遅いし容量がやたらでかくなる*3みたいな欠点があります。相手のPCにPythonをインストールさせれば問題は少ないのですが、そこまでしてPythonで動かしたいものって何? という疑問が生じます。

 例外として、UNIX系でOSに組み込まれているPythonをあてにして動くツールというのは実際にたくさんありますし、作っても良いと言えます。ただ、あれはあれで良い面も悪い面もある文化なので、一概には言えない感じがしますが……そういうものを作ろうとする人はこの記事を読まないかな。

 総評としては、そういうものを作るにはデメリットが目立つ、ということになります。

スクレイピング・チャットbotなど

 この手の処理はどんな言語でもできるといえばできるのですが、最近はPythonの情報が多い気がするので、やりやすいと思います。こういうことを気楽にやるのに向いている気もします。
(ただし、それなりにプログラミング慣れしている人が相応の配慮の元行うのが前提です)

プログラミング初心者の学習用

 この章は特に主観的な面が強いので、そのつもりで読んでください。

 まず、私は「まずはC言語でプログラミングの基礎を理解しろ」という教育を受けたので、PythonみたいなLLから入ることには否定的です。すごく高級な言語なので、初心者は何やっているのかわからないと思います。そういう部分を丸暗記して、なんとなくで書き続ければ「Python」は書けるようにはなるかもしれませんが、「プログラミング」の勉強にはあまりならないような……

 というのは哲学的なことなので、もう少し現実寄りのことを書いておくと、

  • 初心者向けの親切な教材やネット情報が少ない

 致命的

  • 独自の構文みたいなのが多い

 内包表記とか。覚えてもPython以外で役に立たない、知らないとPythonを読めない

  • 細かいハマリどころが割と多い

 インデントが狂ったりとかlist = [[]*3]*3とか。貴重な学習時間をつまらないことで潰したくないですよね

 とまあ、初心者向けの言語ではないので、おすすめしません。同じポジションならRubyとかの方がまだ良いかもしれない。

 そもそもGuidoがUNIXハッカー受けを狙ってクリスマスの暇つぶしに作った言語なので、初心者の学習用で使われるようになるというのは想定していなかったと思います。チュートリアルの冒頭を読めばわかるとおり、「玄人向け」です。

 Pythonが教育で使われているという事実はありますが、ちゃんと見てくれる先生のもとで限定された機能だけを使って学習していると思われます。このあたりに関してはまったく知識がないので憶測含みですが、おそらく基本的な演算とか制御構文、関数あたりの基本的な機能を使ってプログラミングの考え方に親しんでもらう、という趣旨の『教育』ではないでしょうか*4

 なので、プログラミングの勉強の第一歩としてPythonを始めた/始めようとしている人は、よく考え直しましょう。とても気に入っているならやめる必要はないかもしれませんが、向いていないと思ったら他のものに切り替えた方が賢明なはずです。

データサイエンス・機械学習・深層学習・その他の科学技術計算分野

 とりあえずこの辺のジャンルをざっくりまとめてしまいましたが、当然これらはすべて別の分野です。なので、節を分けて説明します。

データサイエンス

 さて、データサイエンスと言っても漠然としていて何がなんだかという世界なのですが、とりあえず考慮するべきなのは以下くらいでしょうか。各項目同士でオーバーラップする部分もありますし、データサイエンスに含めるかどうか悩むものとかもありますが、あまり深く考えないでください。

  • 探索的データ解析(可視化など)
  • 統計処理・分析(検定、分散分析とか)
  • 統計的モデリング(回帰や判別とかいろいろ……)
  • 多変量解析(いろいろ……)
  • その他いろいろ……

 手持ちのデータに対してデータサイエンス的な分析を行いたいという場合、Pythonを積極的に選択するかどうかは悩むところです。この分野には強い競合がたくさんあります。当然Excelも選択肢になりますし、SPSSのようなリッチなソフトウェアもいろいろあります。立ち位置が近いものとしてはRがあります。あとは簡単な処理ならDB叩いてSQLでやっちゃうとか、いろいろ手はあります。

 Pythonの立場は、どれもできなくはないけど、最強ではないしどちらかといえば微妙……という感じではないでしょうか。Pythonで可視化しようとすると面倒くさいし、検定とか統計処理は少し一般的でないことをやろうとするとパッケージがなくて困ったりするし……

 たとえばRは統計系パッケージが充実しているとよく言われます。野良実装みたいなのまで含めればそらPythonにだってあるわ(PyPIにCRANの何倍登録されてると思ってるんじゃ)……と思ったりもするのですが、さすがに大人げないですね。

  • 中堅以上の(ある程度大きな信頼できるチームでまともに開発・メンテナンスされていて、普及している)パッケージで、どれくらい色々な手法なんかが使えるのか

 という観点で見ると、たぶんRが勝るということだと思います。

 まあでも、pandasは強いしstatsmodelsもあるし、メジャーな手法のライブラリはなんだかんだで探せばあるし、というかマイナーなのでも探せばなんだかんだであったりはする。どマイナーなものは別に使えなくても困らないし、最悪必要になったら自分で書く。

 と割り切れば、Pythonのエコシステムですべてが完結します。同じことができるのはたぶんRだけなので、一騎打ちですね。

 あとは考慮するべきなのは好み、慣れ、使いたい手法のライブラリの対応状況、他の処理との兼ね合いくらいでしょうか。積極的に甲乙つける気にはなれないので、保留します。

 特定のことをやろうとするとPythonより良いツールはあるのですが、ぜんぶできるツールとしては最高かそれに準じる立ち位置なので、データサイエンスに向いていないということはまったくないと思います。

機械学習

 深層学習は別ジャンルなので、あくまでもコンベンショナルな機械学習の話です。

 基本的にはほぼデータサイエンス関連と同じ状況。強いて言えば、データサイエンス分野ほどにはRに負けていないか、むしろ勝っている気がします。scikit-learnのエコシステムが強いのと、流行っているのと、やっぱり(機械学習畑の人たちにとって)読み書きがしやすいからでしょう*5

 使いやすいし、情報も多いので、機械学習やりたければPythonというのは良い選択だと思います。

深層学習

 Pythonは深層学習フレームワークのwrapperを叩く環境として、唯一無二の地位を占めています。この分野では最強です。

Q:C++から呼べばいいのでは?
A:いやです。

 が通用するので、この地位は揺らがないでしょう。

 私は正直ほとんど深層学習やったことがないのですが、ここが廃れると他もガタつくと思うので、蛇使い的には深層学習屋には頑張ってほしいなぁ、と思います。

その他科学技術計算

 面倒なのでひっくるめてしまいますが、いろいろありますよね。

画像処理

 OpenCVのwrapperとして使っている人を一定数見かけます。悪くない選択だと思います。ただ、あのエラーメッセージは普通のPythonユーザが読んでも何のことやらって感じなのでは?

音声処理

 ほとんど話題を見かけない。

自然言語処理

 自然言語処理の中にもいろいろあったり、最近はそもそも半ば深層学習に吸収されていたりといった感じですが、それはさておきPythonで自然言語処理というのはよく見かけます。

シミュレーションとか数値解析とかスパコンで走らせるようなやつ

 ……この辺になると畑によってまちまちだと思いますが、さすがにコンパイル言語で書くのでは?

 まあ、強いライブラリ(か、そのwrapper)がある分野では使えます。あとは、numpyやscipyがあるので、気楽にアルゴリズムを書いてみるのには便利です。

その他の考慮事項

 目的別にはだいたいこれくらい挙げれば良いような気がしますが*6、他に考えるべきことをいくつかあげます。

言語仕様など

 Pythonの構文とプログラミングモデルは綺麗だと思います。私個人の感想です。

 公式でPEP8というコーディング規約まで定めて、スタイルの一貫性を重視しているのも良いところです。ただ、さすがに「誰が書いても同じようなコード」は実現できていないのが現状だと思いますが*7。それでも、そういうポリシーを掲げるというのは立派なことだと思います。

 純粋なプログラミング言語として好きになれるようなものである、ということです。LISPに通じるものがあります(でも、そういう言語はPython以外にもあるでしょう)。

インターネット情報

 かつて(私が学び始めた頃)は、Python関係で検索すると、Python2時代の(2008年くらいの)黴の生えたような「はてなダイアリー」の記事が出てきたりして、げんなりさせられました。

 最近はそういうことはずいぶん減って、新しくて質の高い情報がよく出てくるようになったと思います。要するに流行ったおかげなのですが、情報がなく、古くて困るということは今はあまりないと思います。

 あと、(順番おかしいですが)それなりにちゃんと日本語に翻訳された公式ドキュメントもあります。日本語で出てこないときでも、英語では何かしら出てくるので、最悪google翻訳に通したりして読めば問題が解決するのもいいところです。

 さすがにJavaとかとは比べられませんが、ある程度の検索スキルがあれば情報がなくて困るということはそう滅多にはないと思います。

環境構築の容易さ

 Pythonは環境構築が難しいとおっしゃる方は一定数いますね。でも、たとえばWindowsなら公式からインストーラを落としてきて入れるだけです。UNIX系も基本的にはパッケージマネージャで入れるだけです。

 にも関わらず「難しい」印象になってしまうのは、

  • 「他バージョンのpip叩いちゃった問題」がつきまとう
  • anacondaのせい

 慣れてない人が使うとかえってトラブルの原因になる

  • pyenvのせい

 同上。

 あたりの事情が絡んでいる気がします。

 たぶんこの手の操作(環境構築)に慣れている人にとっては簡単だし、慣れていないと難しいはずで、でもそれはどんな言語でもたぶん同じなので、Python固有のデメリットというほどでもないかなぁ、というのが率直な感想です。ただし、IDEのインストーラを走らせればすべてが完了するような言語と比べると、自分でやることが増える分難しいというのは真実かもしれません。

まとめ

 書いていて思ったのですが、無条件でPythonがファーストチョイスと言えるのは深層学習を気楽にやりたいときくらいですね。統計・機械学習などでもかなりファーストチョイスに近い位置にはいますが、Rとカチ合います。それ以外の用途だと、やはりデメリットの方が多い気がします。

 よく言われていることですが、Pythonは汎用のLL言語で、気楽に書けてオールマイティに色々使えるのが強みです。それに情報工学・計算機科学系のあれこれが乗っかっているので最強に見えます。Rには、この言語でなんでもできるという汎用性は(こう言い切っちゃうとR好きの人に怒られるかもしれないけど)ありません。

 こういう特性を理解して使いこなせれば素晴らしい言語ですし、漫然と勉強しても活用することは難しいのかもしれません。メリットを活かした使い方をしよう、ということですね。

# ところで、メリット・デメリットって銘打ったのに、箇条書きでメリットとデメリットをそれぞれまとめるという、よくある書き方をするのを忘れた……まあいいか。

*1:Pythonユーザのことです、念の為

*2:Web向けで高パフォーマンスのコンパイル言語で書きやすいってコンセプトだけで一体いくつあるんだよ、とか

*3:インタプリタ一式持っていくので……

*4:違うよ! こんな感じだよ! というご指摘があれば大歓迎です

*5:でもcaret見るとscikit-learnよりいろんなモデルに対応してていいなぁとか思ったりするんですが

*6:この辺が漏れてるよ! というご指摘は大歓迎です

*7:たとえば具体的に言うと、iterable周りで選択肢が多すぎて書き手の個性が出まくる