NISHIO Hirokazu[Translate]
Hatena2008-10-25
hatena
<body> *1224895628*[最中限]Haskellで最終ラウンド読み切りプログラムを書いた C++で書いたやつと結果を照合しよう。 http://coderepos.org/share/browser/lang/python/saichugen/haskell/saichugen.hs?rev=22097 ----- >|| $ time runghc saichugen.hs [237046,205614,261762,230880,189356] real 6m3.271s user 5m52.644s sys 0m3.304s ||< おそっ。C++で4秒、Pythonで120秒の処理にHaskellで720秒かかるとかおかしい。Haskellはネイティブにコンパイルするはずなのに。 ----- sumが引数の巨大なリストをメモリ上に展開させてしまうんじゃないか、と言われたのでこんなのを書いて置き換えて見たけどやっぱり6分かかるなぁ。 >|haskell| mysum :: Int -> [Int] -> Int mysum result [] = result mysum result (x:xs) = mysum (result + x) xs mysum0 = mysum 0 ||< ----- id:voluntas に渡すためにほぼ逐語的にPythonに翻訳してみた。 http://coderepos.org/share/browser/lang/python/saichugen/haskell/experiment_python.py >|| $ time python experiment3.py [237046, 205614, 261762, 230880, 189356] real 4m5.894s user 4m0.529s sys 0m1.474s ||< あれー。Haskellで6分かかった処理がPythonだと4分だ。。 ----- お、Python版を作っている間にコメントが。ありがとうございます。seqを使って遅延評価をOFFにしてやればいいと、なるほど。試してみます。 ----- >|diff| mysum :: Int -> [Int] -> Int mysum result [] = result -mysum result (x:xs) = mysum (result + x) xs +mysum result (x:xs) = (result + x) `seq` (mysum (result + x) xs) mysum0 = mysum 0 ||< >|| real 6m38.293s user 6m27.055s sys 0m3.467s ||< なんてこったい、かえって遅くなった。 >|diff| add :: Score -> Score -> Score -add (Score x y z) (Score a b c) = (Score (x + a) (y + b) (z + c)) +add (Score x y z) (Score a b c) = (Score (x + a) (y + b) (z + c)) `seq` (Score (x + a) (y + b) (z + c)) --main = print $ (Score 1 2 3) `add` (Score 0 3 0) ||< >|| real 6m51.495s user 6m34.909s sys 0m4.039s ||< な、なんだってー。seqの使い方が間違っているのだろうか。 ----- >> runghc はコンパイルせずに実行します。 << おお、インタプリタなのですか?内部でコンパイルして実行していると思っていました。 >|| real 0m14.942s user 0m13.614s sys 0m0.229s ||< おおー、格段に速くなりました。C++の3~4倍程度になったので、Parallel化してクアッドコアで走らせればC++より少し速くなるかも。。 ----- >> 実行時間から推測しますが、コンパイル時に-O2をつけておられないのでは? << >|| real 0m1.843s user 0m1.803s sys 0m0.023s ||< おおお、C++で書いたバージョンより2倍くらい速くなりました!C++版はリストじゃなくてvectorで持っているのが遅いのかな。そうはいっても2倍も変わるのかな。。 *1224917666*[Python]sumはeagerかどうか id:voluntasが「Erlangに移植するからHaskellのコードをわかりやすくPythonで書いて」と言ったので移植している。sumがeagerかどうか気になったので実験。 >|python| class Foo(object): def __init__(self, i): print "initialized %d" % i self.i = i def __add__(self, v): print "added %d and %d" % (self.i, v.i) return Foo(self.i + v.i) def __del__(self): print "deleted %d" % self.i def gen(): for i in range(3): yield Foo(i) sum(gen(), Foo(100)) ||< 実行結果 >|| initialized 100 initialized 0 added 100 and 0 initialized 100 deleted 0 initialized 1 added 100 and 1 initialized 101 deleted 100 deleted 1 initialized 2 added 101 and 2 initialized 103 deleted 101 deleted 2 deleted 100 deleted 103 ||< 101とか作った後ですぐ1や100のデストラクタが走っているね。eagerじゃないので安心して巨大なジェネレータ内包を突っ込んでも大丈夫だ。 *1224918982*python3.0のイースターエッグ import antigravity http://xkcd.com/353/ 和訳すると 「ちよちゃんはなんで飛ぶのん?」「Pythonですから~」 *1224957031*PySpa <a href='http://journal.mycom.co.jp/news/2008/06/10/033/index.html'>オンラインプレゼン"280 Slides"登場、ネットとOSXネイティブ両対応か | エンタープライズ | マイコミジャーナル</a> すごい、、JSでブラウザ上でKeyNoteみたいなものが動いている。。PowerPoint形式やPDFでエクスポートできる。すさまじい。JSってこんなことまで出来るんだ。。 おお、画像貼ろうとしたらネットから検索して貼れる。 <img src="http://gyazo.com/d6b43a91bbb19b8cb18de5b41eff4359.png"> ダウンロードはPowerPointとかPDFとか! <img src="http://gyazo.com/4664be707320f4dc77a30cd06f8c8fda.png"> ----- DropBox 20GBだったかなんだったかを無料で使えるストレージ ----- http://djangoproject.jp/doc/ja/1.0/ DjangoのドキュメントはJavaScriptで検索できるのか。便利便利。 </body> <comments> <comment> <username>const ()</username> <body>これ?<br>http://itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?ST=develop&P=2</body> <timestamp>1224917586</timestamp> </comment> <comment> <username>s</username> <body>runghc はコンパイルせずに実行します。</body> <timestamp>1224931958</timestamp> </comment> <comment> <username>tanakh</username> <body>実行時間から推測しますが、コンパイル時に-O2をつけておられないのでは?</body> <timestamp>1224939456</timestamp> </comment> <comment> <username>const ()</username> <body>書き換えるとしたら<br>mysum result (x:xs) = result' `seq` (mysum result' xs)<br> where result' = result + x<br>add (Score x y z) (Score a b c) = x' `seq` y' `seq` z' `seq` Score x' y' z'<br> where (x,y,z) = (x+a,y+b,z+c)<br>ではないかと。<br>最適化がそこまでやってくれるのかもしれないけど。</body> <timestamp>1225092242</timestamp> </comment> </comments>

"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]