Python と Ruby
プログラミングは素人だ。というより、自分がプロだと言える分野はないなと思う。それはさておき、
最近趣味と仕事で Python プログラミングをする機会があった。Python を選んだ理由は、ライブラリが充実していてノウハウが簡単に見つかるというだけだ。とはいいながら、以前から気になりつつもほとんど使ったことがない Ruby もちょっとだけ触ってみた。Ruby は既存のクラスにもインスタンスメソッドを追加できる。
100000 までの素数を表示する。
require 'time' start = Time.now() class Integer def is_prime() if self < 2 then return false end i = 2 while i*i <= self if self % i == 0 return false else i += 1 end end true end end for i in 1..100000 do if i.is_prime print(i, " ") end end puts "\nTime", Time.now-start
Ruby は Integer クラスに勝手にインスタンスメソッドを定義できてしまう。これを Python で書くと
import time start = time.time() def is_prime(n): if n <2: return False i = 2 while i*i <= n: if n % i == 0: return False else: i += 1 return True for i in range (100000): if is_prime(i): print(i, end=' ') print("\nTime", time.time()-start)
となる。こちらは関数で書くしかなさそう。いや、Ruby だって関数で書けるんだけど。それはさておき、どちらの言語が好きかと言われたら難しい。インデントだけでブロックを表示する Python より Ruby のほうがわかりやすい気がする。書籍もネット上の情報も Python の方が多いし、仕事で使うなら Python なんだろうけど。
ちなみに実行速度は Python のほうが少しだけ早かった。が、どうやら画面表示の速度がボトルネックらしい。表示のところをコメントアウトすると Ruby の方が少し速かった。
そういえば、学生時代に C++ で遊んでみたときは、どうにもオブジェクト指向というものがよくわからなかった。なぜか今はほとんど違和感がなくなった。どうやら、抽象的な概念を抽象的なまま理解したらしい。
うまく説明できないが、オブジェクトとは作るためにあるのではなく、使うためにあるのだと感じる。上のプログラムも、for i in 1..100000 do
から書くと if i.is_prime と書きたくなるが、is_prime の定義から書き始めると、関数で書きたい気持ちになる。
だからたぶん、使った経験が少なかった頃は、オブジェクトを作ることもできなかったのだろう。既存のライプラリをたくさん使い、オブジェクトを使うことに慣れたので、自分で書けるようになったのだろう。たぶん。