7rpn’s blog: うわああああな日常

好きなことをつらつらと。AIとかで面白いことをしたい。

PythonとRuby,始めるならどっち?

2016年の今だからこそ。

昔だったらスクリプト言語やり始めたい場合はPythonRubyの好きな方を選べって感じでした。 でも現在では,好きな方を選べって返答はたぶん間違いになると思います。 じゃあどっちを選べば良いのかってお話。

どうしてこんな記事を書くのか

自分はRubyが好きです。でもPythonも使ってます。 そのうえで,世の中のPythonRubyの比較記事ってどちらかに偏ったものが多いな,と思うわけです。

例えば。 Rubyが好きだからPythonにもmap使わせたり(あまり使わない),Pythonが好きだからRubyにもfor文使わせたり(まず使わない),そんな例ばかりです。 そんな書き方してたら自分の好きな言語が使いやすいに決まってるじゃないかっていう例を出しているので。

そういうわけであくまで中立を保ってる自分がこういう記事を書いてみたいな,と思ったわけです。

というわけで本題

どっちの言語からやるのが良いか?の返答として,やりたい内容に依る ってことを強く伝えたいです。

自分が両方の言語を使う際は,内容によってはっきりと使い分けています。 例えばWeb系。これは絶対Ruby。 対して機械学習系。これは絶対Python

RubyでもPythonでもできることはRubyで,PythonでしかできないことをPythonでやってるって感じですかね。
どっちでもできる内容なら,日本語で書かれたWebサイトとかたくさんあるRubyを選ぶので。
そんな感じで使い分けをしています。

Rubyが得意とする分野

Rubyの産みの親が日本人のかたなので,日本語のドキュメントの多さ ではPythonを上回っていると思います。 最新の情報をかなり速い段階で追って行けるっていうのはありがたいです。英語も読めるけど日本語の方が格段に理解が速いので。

元祖WebフレームワークであるRailsが強いので,Web系は今でもRubyが強い印象。 RubyPythonに比べて遊びの分野で強い印象があります。

Pythonが得意とする分野

主に学術分野です。この分野ではもはやPyhton一強なのではってぐらいPythonが強いです。 数値処理がなんでも高速でできるnumpy,化学計算用のライブラリが詰まったscipy,グラフ描写にmatplotlib,自然言語処理にNLTK,統計処理や機械学習にscikit-learnと学術系ライブラリの豊富さではほか言語の追随を許さないレベル。
Googleが出したDeep learning用のライブラリ(Tensorflow)もPythonですしね。この分野でのPythonの浸透力はかなりのものだと思います。

ていうか学術分野以外でもRubyと同レベルのライブラリが揃ってます。ライブラリの豊富さでは(Rubyも豊富ですが)Rubyを越えている感じ。ただ日本語のドキュメントが少ない。

Python2だと日本語操作で泥沼にはまるって経験を何度もしたので,自然言語処理とかはPython3を使いましょう。RubyでできるならRubyでも。

ランキングから両者を比較

というわけで主要なプログラミング言語ランキング。 こちらのサイトから引用させていただきました。

IEEE TIOBE Devpost GitHub RedMonk
1位 Java Java HTML/CSS JavaScript JavaScript
2位 C C JavaScript Java Java
3位 C++ C++ Python Ruby PHP
4位 Python C# Java PHP Python
5位 C# Python C / C++ Python C#
6位 R Objective-C PHP CSS C++
7位 PHP PHP Objective-C C++ Ruby
8位 JavaScript Visual Basic .NET C# C# CSS
9位 Ruby JavaScript Swift C C
10位 Matlab Perl JSON HTML Objective-C

Pythonは常に3位から5位をキープ。対してRubyGithubでは3位だけれどもTIOBEではランク外だったり。大抵10位前後にいるイメージ。 Pythonは強いだけあるなぁって感じですね。ていうか自分もCとかJavaとか速い言語書けるようになるべきなのかって少し思ってしまう

Python一択では

ここまで見てると日本語ドキュメントがなくても困らない程度に英語が読めるなら正直Python一択なのでは... って感じになってしまうのでRuby好きの自分としてはRubyの株も上げておきたい

Rubyの良いところ

Ruby「ストレスなくプログラミングを楽しむこと」 を重視して作られた言語だそうです。 ストレスなくプログラムが組める,これめっちゃ重要なポイントじゃないですかね。

Pythonだとエラー取れなくてこのやろうみたいな感じでプログラム組んでますが,Rubyだとエラーに引っかかることがかなり少ないです。 やってる内容もPythonの学術関係の方が難しいことが多いのでPythonのほうがエラー取れなくて当たり前だと思うんですけど,それでもやっぱりRubyのほうが日本人の自分にとっては楽に感じます。

これはプログラミングのモチベーションを維持するのに役立つのではないでしょうか。
日本語のドキュメントが多いことも相まって,ストレスが数倍少ないように感じます(個人差があります)。

あとPythonはもとが格好いい言語なので格好良く書くことを求められるわけでそれで苦労しますが,Rubyは何も考えなくてもそこそこ美しくなる感じもGood。これは偏見かも。

Pythonはfor for for,Rubyはeach map select

Pythonはただひとつの美しいやり方があるってスタンスなのに対して,Rubyは同じことでも色々な方法でできた方が美しいって考え方です。

プログラムをちょっと比較してみます。 Pythonはfor文がかなり強くて,配列操作ならとりあえずforしとけって感じ。Python3は2よりもさらにmap系の非推奨感が増してる感あります。
対してRubyは普段for文なんか使っている人見たことなくて(必要になる場面も稀にあります),each,map,selectみたいなメソッドを使い分ける感じです。

arr = [2, 6, 3, 8]
for x in list:
  print x
print( [x**2 for x in list] ) # => [4, 36, 9, 64]
print( [x for x in list if x>4] ) # => [6, 8]
arr = [2, 6, 3, 8]
arr.each do |x|
  print x
end
print list.map{|x| x**2} # => [4, 36, 9, 64]
print list.select{|x| x>4} # => [6, 8]

まったく同じ内容を二つの言語で書いてみましたが,決定的に違う点があるのが見つけられますかね?

Pythonは右から左,Rubyは逆

Pythonは右から左に処理が流れることが多いんですけど,Rubyは逆なんですよね。 だから自分はRubyが好きになりました。文章を書くときと同じ感覚で流れるように左から右に書いて行けるので。Pythonだと行ったり来たりして流れるように書けないので思考が中断してしまうんですよね。ここは人の好き好きだと思います。

例えば,さっきの例での比較。
listから一つずつ要素をxとして取り出して,それを一つずつ2乗するっていう処理。

#Python
 [x**2 for x in list] 
#Ruby
list.map{|x| x**2}

PythonRubyが逆でしょ。思った通りに左から右に書けるRubyが自分には良いなぁって思います。使いやすい。

結論

まぁ結局始めるならPythonなんじゃないですかね。Pythonやっておけば他の言語が必要になることってほぼないのでは?ってくらい何でもできる印象があります。

それでもこの記事読んでてあーRuby良いかもって思った人はRubyだと思います。学術目的やる予定ないんだったらRubyだと思う。最終的にはどっちもやってしまえば良いよ。

やっぱり自分に合ってる方が良いよね,みたいな記事でした。


関連:
名大で一番リア充が入る学部はどこだ? Project OxfordのEmotion APIを試す

Googleが出した囲碁ソフト「AlphaGo」の論文を翻訳して解説してみる。