一般的な処理を関数型の書き方をすると遅い

■ このスレッドは過去ログ倉庫に格納されています
2014/01/26(日) 15:05:44.15
Rubyで関数型とか遅いからやめればいいのに
2014/01/26(日) 15:06:32.36
関数型に適した問題を、
関数型に特化した言語でやって
どうにか速い例が見つかる程度。
3デフォルトの名無しさん
垢版 |
2014/01/26(日) 15:08:32.09
まあそうだよねw
2014/01/26(日) 15:14:08.87
副作用を起こさないから、配列を処理して配列に入れなおしてって
やってるから、メモリコピーのコストかかるし、メモリ使用量も増えるしね。
2014/01/26(日) 15:15:07.78
普通にループで書いてブロックの中に処理書けばいいのに、
関数呼び出しにしてしまうからその分のコストもかかる。
2014/01/26(日) 15:16:09.95
Ruby よりは速いから問題ないよ
2014/01/26(日) 15:32:58.37
>>4
その辺は最適化次第な気がする。
まあ、それを前提にしてる言語(Haskellとか)でないとそういう最適化もやりづらいだろうけど。
2014/01/26(日) 16:00:44.07
意味分からん。
Rubyの時点で遅いだろ。

無理せずC/C++を使えよ。
9デフォルトの名無しさん
垢版 |
2014/01/26(日) 16:07:26.20
>>8
あすぺおつ
2014/01/26(日) 17:15:31.95
次から次へと自分の無能を宣伝するスレを立てて嬉しいのかこのバカは?
2014/01/26(日) 17:19:35.61
>>10
事実ですが
2014/01/26(日) 17:22:58.01
「一般的な処理を関数型の書き方をすると遅い」

それは体感とか実測からくる事実なんだろう

しかし、それだけなら関数型の書き方にできる機能など誰も盛り込まないはず

速度を失った代わりに得たものがあるんじゃなかろうか
たまたまそれが >>1 にとってメリットに感じなかっただけで

だから、考えもしないでやめればいいのにというのは安直だ


ところで、関数型の書き方って何?
2014/01/26(日) 17:27:15.45
まあ>>1にはわかってないんだろうさw
2014/01/26(日) 17:29:08.45
はっきりした定義はないけど…たぶん >>1 が例に出したRubyでなら
生のループ文を使わず、再帰やcollect/select/detect/inject/rejectなどを使い
ifやcaseの分岐は文ではなく式として用いて
変数への再代入をしないプログラミング…って感じじゃね?
2014/01/26(日) 17:32:24.44
関数を一級のオブジェクトとして扱うのが関数型の書き方に決まってるだろ
それ以外あるのか
2014/01/26(日) 17:35:43.55
それは書き方じゃなくて言語仕様とかの話じゃね?
17デフォルトの名無しさん
垢版 |
2014/01/26(日) 17:35:53.35
>>15
ループの代わりに再帰を使うとか、副作用がないとか
2014/01/26(日) 17:36:08.25
>>15
そこでいう「関数」が何を指すかが問題だ

数学的な関数に近い意味での関数表しているのか、
C言語みたいなプロシージャに近い意味での関数を表しているのか

前者なら、関数を一級のオブジェクトとして扱うだけじゃ
関数型の書き方というには足りないと思う
2014/01/26(日) 18:07:02.54
もともと意図して設計してない以上あったりまえだろ
2014/01/26(日) 18:07:30.44
>>11 君の無能が事実なんだねw
2014/01/26(日) 18:08:27.37
>>17
まったくわかってない
再帰は手続き型言語でも普通に使うし
対象が数学的関数なら手続き型言語で書いたって副作用はない


int fib(int n) {
 return n < 2 ? n : fib(n-1) + fib(n-2);
}
22デフォルトの名無しさん
垢版 |
2014/01/26(日) 18:15:37.44
>>21
うん、でも関数型でよく使われるものでしょ。
だからそれを関数型の書き方と言ってるのかもしれないと
予想できるでしょ。文章を理解する時ってそういうふうに
推理するものだよね。相手が言ってることを偽になるように解釈して
いったら辿り着く先は誤解でしかないと思うけどなあ。
23デフォルトの名無しさん
垢版 |
2014/01/26(日) 18:18:08.97
>>22
でももへちまもないよ。おまえの理解は間違ってる

関数型言語の特徴は高階関数を使うことだっていってんの
そのために一級にしてるんだから
24デフォルトの名無しさん
垢版 |
2014/01/26(日) 18:20:30.50
>>23
間違ってるかどうかは言った本人に聞かないとわからないでしょ。
あなたが判断することではないし、あなたが判断できることでもないよ。
だからあなたが何言おうと無駄だと思うけどなあ。
自分の解釈が絶対正しいんだーなんてのは思い込みだよ。
世の中に絶対なんてことはないんだ。常に自分を疑うべき。
2014/01/26(日) 18:22:45.19
そういうメンドクサイ哲学的な話に興味ないからもういい

俺が言いたいのは、再帰や副作用なしってのは関数型言語と関係ない

ということだけ
2014/01/26(日) 18:28:58.86
メンドクサイことは好きなんだろ
くだらない日曜夕方の雑談に花咲かしていけよ
27デフォルトの名無しさん
垢版 |
2014/01/26(日) 18:29:05.51
>>25
そういう解釈ができるってだけの話だね。
相手の言うことを理解するときに自分の物差しで
測ってどうこう言ってもしょうがないと思うけどなあ。
そういうことやって周りの人間とうまく関係を構築できるものなのかなあ。
あなたの人生が心配です。
2014/01/26(日) 19:59:56.73
遅いかどうかの話。
関数型に適していない問題を
書き比べてみればいい。
2014/01/26(日) 20:00:45.27
データ構造を扱う問題は適さないよな
2014/01/26(日) 20:03:10.26
時々関数型言語は速いなんて反論を見るけど、
それ一部の処理を省略することができる問題を
関数型言語では省略して、
手続き型・オブジェクト指向言語では、省略しないで
不公平なコードで比較しているんだよね。
31デフォルトの名無しさん
垢版 |
2014/01/26(日) 20:05:17.99
>>28
クイックソートかな
2014/01/26(日) 20:10:37.18
ではクイックソートの実装を関数型言語 VS C言語で
比較してみましょう。
2014/01/26(日) 20:12:01.93
代入の代わりに遅延評価が使えず、新しく生成するようなプログラムは遅くなるし、リソースを無駄に使う
だから純粋関数型言語ではなく、scalaを使って手続き型と関数型の良いどこどりしましょうね〜
2014/01/26(日) 20:13:37.36
速いのが良いならアセンブリとCだけ使っとけばいいよもう
2014/01/26(日) 20:14:04.16
なかなかおもしろいことになりそうだw

http://elephnote.com/blog/archives/838
> Togetterにいろいろな主張のまとめがありました。曰く、
>
> 「In-placeソートでないからだめ」「というか遅い」「いやHaskellに効率を求めてはいけない」
> 「5行の例はPivotingをしていないのでだめ」「Pivotingはクイックソートの本質ではない」
> 「メモリを抽象化していて扱えていないのでとても遅い」
> 「Haskellでメモリの議論をするべきでないしIn-placeソートでなくてもよい」
> 「Haskellでクイックソートをしっかり書きたいなら手続き型風に書くのが良い」
2014/01/26(日) 20:15:53.97
そもそもなんで最近になって微妙に流行ってんの?
スクリプト言語が採用したから?
2014/01/26(日) 20:17:58.23
>>36
jQueryが間接的な発端じゃないでしょうかね?

jQueyrは関数型に似ている

関数型言語とはなんぞや?

関数型言語とはうんぬん(略)
2014/01/26(日) 21:06:33.86
非同期厨とも似たような臭いがするんですがそれは
2014/01/26(日) 21:07:42.95
非同期IOは実利を伴うからいいんです
40デフォルトの名無しさん
垢版 |
2014/01/26(日) 21:34:04.52
ゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミwwwwwwwwwwwwwww
41デフォルトの名無しさん
垢版 |
2014/01/26(日) 21:34:40.02
>>40
ゴミで何が悪いんだ、夢の島にうめたろか?
2014/01/26(日) 21:40:53.62
お前は肥溜めかコンポストな
2014/01/26(日) 21:43:47.72
フィルターのメソッドにブール型を返す関数とかを入れるってのは凄くいいと思うよ
44デフォルトの名無しさん
垢版 |
2014/01/27(月) 01:08:26.16
ゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミwwwwwwwwwwww
45デフォルトの名無しさん
垢版 |
2014/01/27(月) 04:36:54.16
>>36
流行ってるって2ちゃんの話だろ?
具体的なショーケースはなにもない
LispやD言語やVBのスレが勢いある2ちゃんの話だろ
2014/01/27(月) 04:46:22.34
VBのライバルであるDelphiを忘れないで下さい。
2014/01/27(月) 08:08:20.18
>>45
ドカタには無縁なだけですよ
2014/01/27(月) 21:40:11.67
デカイサービスやビジネスに採用された例ってあんの?
2014/01/27(月) 22:18:50.03
>>35
わかりやすさでは、Haskellの圧勝。
2014/01/28(火) 00:22:12.97
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
2014/01/28(火) 23:31:09.20
>>1
一般論を言えばその通りだ
性能に関して言えば、関数型に適したアルゴリズムやデータ構造の
研究/開発と、その普及が重要になってくる
たとえばアルゴリズムであればメニーコア時代の並列処理や
モナドに代表される圏論を応用したソフトウェア部品化技術、
データ構造であれば「永続データ構造」や「メモ化」(Wikipedia等を参照)が
キーワードになるだろう

Rubyなら、こんなGemがあるね
・Ruby で並列実行処理を簡単に書く
  http://subtech.g.hatena.ne.jp/secondlife/20110927/1317123109
・Rubyで関数型プログラミングをするための ImmutableList gem を公開
  http://gam0022.net/blog/2013/10/22/immutable-list-gem/
あとOSX/iOS上の並列技術であるGCDは、MacRuby/RubyMotionから
お手軽に使えるから、Macユーザにはお薦めだね
・ASCII.jp:マルチコア時代の新機軸! Snow LeopardのGCD (1/4)
  http://ascii.jp/elem/000/000/455/455786/
52デフォルトの名無しさん
垢版 |
2014/02/04(火) 06:08:47.82
>>1
そんなわけない。
今後は、マシンパワーをフルで使う処理こそ関数型になってくだろ。
遅いのは処理系。
53デフォルトの名無しさん
垢版 |
2014/02/04(火) 06:18:09.82
関数型でしか書けないってのは強い制約。
わざわざ不便にするのは、実行の流れを無くすためとか。
そうなれば、主導でマルチスレッドプログラムせずに、自動でマルチスレッド対応に出来る。
54デフォルトの名無しさん
垢版 |
2014/02/04(火) 19:19:33.49
>>47
多い土方が使用してないんじゃ流行ってるとは言わないだろ
2014/02/05(水) 02:15:51.68
まあ遅さが問題にならないとこで
物好きだけが使ってればいいんじゃないでしょうか
2014/02/05(水) 08:45:41.16
関数型は遅いダメだろ
時代はウインドウズでC♯とVBを極めるのが最強。関数型は絶対に使うな!
VBとC♯だけに集中して関数型は使わないようにするのが情強だぞ。絶対に使うな。関数型はクソだとみんなも言っているだろ。VBとC♯だけをやるのが正しい。絶対に関数型は使うな。関数型はクソだ。
2014/02/05(水) 09:03:52.18
C#も遅い
C++があるんだからそれ使え
2014/02/05(水) 12:53:57.33
>>56
ププ
59デフォルトの名無しさん
垢版 |
2014/02/05(水) 17:50:26.29
代入が出来ないとか強いプログラム上の制限がある分、速く出来るのが普通だ。
翻訳、コンパイルするほうの性能が悪いだけ。
2014/02/05(水) 17:52:21.46
静的単一代入
61デフォルトの名無しさん
垢版 |
2014/02/05(水) 18:37:25.38
関数型を使ってみました。
目から鱗でした。
目には鱗が付いていることがわかりました。
これはすごいです。
ナチュラルかつ完璧な制約があります。
ごく自然な形で制約を受け入れたコードが書けるのです。
制約は私を縛るものではありませんでした。
構文上のみならずロジック上の誤りすら見つけ出してくれるのです。
コンパイルを通ればバグが無いことが保障されました。
そして、生成されたコードは速いです。
Cの二倍速いJSよりさらに早いです。
これはJSなんか使ってる場合ではないと思いました。
2014/02/05(水) 18:54:11.31
関数型で書けないコードってあるの?
ヒープソートとか辛そうだけど
63デフォルトの名無しさん
垢版 |
2014/02/05(水) 18:58:27.64
Javascriptは関数型ハイブリッド言語。
Javascriptのクイックソート。

QuickSort = function (X) {
if (X.length <= 1) return X;
var pivot = X[0];
return (new Array).concat(
QuickSort(X.filter( function(x){ return pivot>x;})),
X.filter( function(x){ return pivot==x;}),
QuickSort(X.filter( function(x){ return pivot<x;})));
};
64デフォルトの名無しさん
垢版 |
2014/02/05(水) 18:59:08.27
Scalaのクイックソート


def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}

https://sites.google.com/site/scalajp/home/documentation/scala-by-example/chapter2
2014/02/05(水) 19:01:15.54
たぶんCのクイックソートが一番速いだろうな。
2014/02/05(水) 19:04:32.98
>>64
手続き型で書いた場合と比べると読みにくいし、理解するのが難しい
それでもって速度はJava以下
笑えるな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況