minofoto and miscellaneous notes

ごく気まぐれに,書きたいことを適当に書いています。本当の話かもしれませんし,フィクションかもしれません。

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 の定義から書き始めると、関数で書きたい気持ちになる。
だからたぶん、使った経験が少なかった頃は、オブジェクトを作ることもできなかったのだろう。既存のライプラリをたくさん使い、オブジェクトを使うことに慣れたので、自分で書けるようになったのだろう。たぶん。