FC2ブログ

名もなき黒猫の散歩道

MENU

でんでん虫

こんにちは、黒猫です。もうすぐ新年度ですね。桜が日本では咲き始めている頃でしょうか?

こちらサンフランシスコは現在雨期の真っ最中で、最近ずっと雨の日が続いています。1年のうちほとんどの雨の日が、12月から2月に集中するのが普通なのですが、今年は2月までは降らなかった分、3月に集中しているようで、久しぶりに日本らしい日々?を過ごしております 笑

さて、サンフランシスコに来てやたら多いなと思ったのがコイツたち。
IMG_6864.jpg 
カタツムリです。他の場所は知りませんが、私の住んでいる周りではやたらとカタツムリを見ます。で、この写真を見て何か思いませんか?そう、カタツムリは足跡を残すらしいのです!黒猫は全然そんなこと知りませんでしたので、これを見た時は「なんで!?」と思いました。まぁそう思ってしまうともっと間近で見たくなるものでして、アップ写真も頑張って撮りました 笑

IMG_6865.jpg 
尻尾が浮いていますね!頭も、影の様子を見る感じ、浮いていそうです。どうやら、カタツムリはのそのそと這いずって前進しているのではなく、体の一部だけを地面に付けて、他は宙に浮かせて動いてるみたいです。ある程度身体が前進したら、新しい場所に着地して、また前進する、という感じですね。

ここから先はネット情報ですが、実はナメクジはこの動きをできないらしいです!(ご想像通り、這いずって前進します)ですので、足跡を見れば、その生き物がカタツムリかナメクジか分かる、ということになりますね!え、甲羅を見ればわかるじゃないかって?そんな利口なツッコミをできる人は嫌いですよ 笑 でも実際に、ナメクジの中には小さいとはいえ甲羅を持つものもいますので、こういう判別方法も大事なのかも知れません(その他、呼吸する器官などが違うようですよ)。


というわけで、久しぶりに日常の更新でした。何はともあれ、雨が大好きというわけではないので(サンフランシスコは日常的に寒いですし)、早く雨期には明けてほしいものです。ではこのあたりで。読んで下さりありがとうございました!


スポンサーサイト

大蛇の咆哮

ヘビが吠えるのかどうかはさておき 笑

こんにちは、黒猫です。

前回のブログでは、Pythonがいかに遅いかをまざまざと見せつけられたため、さらに他の言語とも比較してみようと思い、Java, Ruby, R言語も追加して全部やり直してみました。その結果がこちら!
Fig_180222_test_1.png

なんでPython2の方が遅くなってるんだ・・・?
もしかしすると私のPCで時間を計る時に、他のアプリをどれくらい開いているのかに、結果が影響を受けているのかも知れません。しかし全てのデータは同じ日に取っていますので、やっぱりPythonが遅いということには変わりないようです。

ちなみに速いお方達の拡大図はこちら。

Fig_180222_test_2.png 
じ、Javaはえぇ。。。
このあたりはコンパイラ(機械語へ翻訳するプログラム)がいかに優秀かに依存しているようです。ちなみにこれを計った後に、C++を最適化してコンパイル(機械語へ翻訳)する方法を知りまして、それをやってみると、0マイクロ秒以下になって計測不能になりました
なので、おそらく最速はC++です。Cは試していませんが、おそらくこの程度ならC++とほぼ同じ速度を発揮すると思います。


というわけで、汚名を挽回できず最下位に終わったPython
しかし、ちまた(特に機械学習やAI系)ではPythonは大人気です。機械学習やAIでこういう煩雑な処理が皆無とはとても思えません。なので何とかなるのではないかと思って色々と考えてみました。
今回使用したコードは以下になります。


#coding: utf-8
import time

for i in range(10):
    start = time.time() #計測時間開始
    ans = 0
    for i in range(100000000):
        ans += (i+1)
    end = time.time() #計測時間終了
    print(end - start)


このコードがなぜ遅いかというと、1億回の繰り返しを行っている“for i in range(100000000)”というところが遅いからに他なりません。ここでは、「ansという名前の変数を読んできては、数字を足して、ansにもう一度値を代入する」という動作を1億回行っています。実はこの「ansにもう一度値を代入する」というのは時間を遅くする要因になったりします。というわけで、値を代入する回数を減らそうと思いました。その結果がこちら。


#coding: utf-8
import time

def ichioku(que):
    for i in range(100000000):
        que += (i+1)
    return que

for i in range(5):
    start = time.time() #計測時間開始
    ans = 0
    ans = ichioku(ans)
    end = time.time() #計測時間終了
    print(end - start)


このコードでは、ichiokuという名前の関数(道具)を作っています。この関数を使えば、ある値を渡してやると、その関数の中で1億回足し算をしてくれ、その結果だけを返してくれます。つまり上のコードと比べて、「ansにもう一度値を代入する」という動作が少なくて済みます。

さらに、関数を作ってやると、「JITコンパイラ」というものを使うことが出来ます。これは簡単に言うと、「Pythonの処理を最適化しよう」という道具です。これの使い方は簡単で、以下のように、"import numba" と "@numba.jit" を書き加えるだけです。


#coding: utf-8
import time
import numba

@numba.jit
def ichioku(que):
    for i in range(100000000):
        que += (i+1)
    return que

for i in range(5):
    start = time.time() #計測時間開始
    ans = 0
    result = ichioku(ans)
    end = time.time() #計測時間終了
    print(end - start)


というような感じで、3種類用意してみました。果たしてその結果はいかに!?

Fig_180222_python.png 

Inlineが何も変化を加えていない1つ目、Definitionが関数を作った2つ目、そしてJITがJITコンパイラを用いた3つ目です。
JITコンパイラ速過ぎるやろ。。
ちなみに平均値を書くと、Inlineが27秒、Definitionが17秒、そしてJITが0.2秒でした。
Definitionで約2倍に速度が向上するのにもびっくりしたのですが、それにもましてJITコンパイラの威力にただただ脱帽しました。これでもC/C++・C#・Javaには敵わないのですが、使える程度には十分に速いと私は思います。
(ちなみに関数を作ると今回Pythonは速くなりましたが、Rubyで同じことをしても速くなりませんでしたし、C#では遅くなってしまいました。このあたりは書き方や、言語のクセに、結果が左右されるようです)


というわけで、何とか汚名を挽回できました。よかったね、Python 笑
(ちなみにC++とPython以外の速度の向上方法は調べておりませんので、全ての言語がもっと速くなる可能性は十分にあります。特にSwiftは速いと言われるのでもっと速くできると思います。)

というわけで、自己満足は一区切り尽きました 笑
読んで下さった方々、どうもありがとうございました!


該当の記事は見つかりませんでした。