スケーラビリティ(マルチコア)の理由からPythonではなくClojureを使用するのは良い考えですか?[閉まっている]


8

http://clojure.org/rationaleと、Clojureと多くの言語の間の他のパフォーマンス比較を読んだ後、使いやすさを除けば、Pythonではなく、Clojureでコーディングするべきだと思い始めました。実際、私はClojureを学ばないことに無責任であると感じ始めました。

それは意味がありますか?Lisp方言や他の関数型言語よりも、Pythonなどの命令型言語を使用して、すべてのコアを本当に効率的に使用できないのでしょうか。それのすべての利点は不変データを使用することから来るようですが、Pythonでそれを行うだけですべての利点を得ることができませんか?

私はかつてCo​​mmon Lispを学び始め、大学図書館から借りたからほとんどすべての演習を読んで実行しました(Amazonでの人気が低いにもかかわらず、かなり良いことがわかりました)。しかし、しばらくして、簡単なことをするのに苦労しすぎた。本質的にもっと不可欠なものがあり、それらを機能的な方法でモデル化することが困難になると思います。

では、この新しいマルチコアの未来を利用するアプリケーションを構築するために、PythonはClojureと同じくらい強力ですか?

セマフォ、ロックメカニズム、または他の同様の同時実行メカニズムを使用することは、Clojureの「自動」並列化に代わる優れた方法ではないと私は思います。


5
あなたが達成しようとしているように思われることに基づいて、あなたは本当にアーランも見るべきです。
Jerry Coffin

2
それはまだここにありませんし、うまく機能しないかもしれませんが、PyPyの人たちのSTM計画(まあ、主に1つはArmin Rigo)はクールに聞こえ、この質問に明白に関連しています。

回答:


4

Lisp方言やその他の関数型言語よりも、Pythonなどの命令型言語を使用して、すべてのコアを本当に効率的に使用できないのでしょうか。

あなたは間違いなくできます。問題の種類(たとえば、いくつかの大きな計算タスクの明確に分離可能な部分を並行して処理する)によっては、かなり簡単になることさえあります。パラダイムは関数型ソリューションに移行していますが、世界の並行性のほとんどは依然として命令型言語で直接行われていると思います。

ただし、Pythonの同時実行機能は正確には知られていません。優れた並行処理サポートを備えた確立された命令型言語の例はJavaです。

それのすべての利点は不変データを使用することから来るようですが、Pythonでそれを行うだけですべての利点を得ることができませんか?

不変データの秘訣は、配列などの従来の単純なデータ構造を使用すると、大量のコピーとガベージコレクションが発生し、パフォーマンスが損なわれることです。代わりに、効果的な不変データが必要です。これは、Clojureの内部で行われるように、さまざまな永続データ構造で実装できます。このような構造は、ライブラリとしてほとんどすべての言語で実行できますが、もちろん直接言語サポートの方が優れています。


8

Pythonは、複数のスレッドを必要とするアプリケーションにとって非常に悪いですが、それは、言語自体ではなく、利用可能な仮想マシンの不足が原因です。Pythonのジェネレーターは、暗黙的な並列化の候補として最適です。問題は、標準の実装であるCPythonがPythonコードを実行できるのは1つのCPUのみであり、ネイティブライブラリの呼び出しのみが並行して実行できることです。PyPyランタイムはそれを修正する予定ですが、まだありません。JythonとIronPythonの実装には制限がありませんが、それらはかなり不完全です(標準ライブラリの多くがないため、標準ライブラリを使用する必要があります)それらのホスティング環境の)。

ただし、並列処理を使用して設計および実装された他の多くの言語があります。もちろん、並列処理は関数型言語ではるかに簡単です。そのため、並列処理が適切にサポートされているすべての言語は、関数型であるか、関数型プログラミングを強力にサポートしています。私は考えることができます:

  • Haskell、最も使用されている純粋で厳密でない関数型言語。それは純粋な非厳密な性質であるため、コンパイラはいくつかのことを暗黙的に並列化できます。
  • Erlangは、堅牢な並列サーバーを実装するために特別に設計された厳密な関数型言語であり、クラスターへの配布のサポートが組み込まれています。
  • もちろん、Clojure。他のlispsと同様に、関数型プログラミング用に設計されていますが、命令型プログラミングもサポートしています。
  • Goは、同時実行用に設計された、新しくコンパイルされた手続き型言語ですが、ランタイムも言語自体もまだ非常に成熟していません。
  • Rustは、同時実行性、低オーバーヘッド、メモリの静的チェック、同時実行性の安全性のために設計された、新しくコンパイルされた手続き型言語です。まだあまり成熟していない。

Goは、約2年間のオープンソース開発の後、それが1.0リリースになったばかりです。
ソニア

1
また、Pythonにはマルチプロセッシングパッケージがあります。
ソニア

haskellが高速(Pythonよりも高速)である可能性があることを本当に知りませんでした。私はプログラミングの最初のコースでそれを「学びました」、私は間違いなく再びそれを見る必要があります。
Julio Rodrigues、

1
@Vandell:Haskellは静的に型付けされたコンパイル言語であるため、予想より高速です。The Computer Language Benchmarks Gameによると、HaskellはJavaとMonoにほぼ匹敵します。
Jan Hudec 2012

@ソニア:...これは私があまり成熟していないと呼んでいるものです。言語仕様が確定するまでには通常10年以上かかります。私は少なくともGoがJavaとC#をフォローし、いつかジェネリックを入手することを期待しています。
Jan Hudec 2012

2

ここの人たちは本当に素晴らしい答えを出しました。

「状態の共有」のため、並行プログラミングは通常困難です。関数型プログラミングは究極の答えではないかもしれませんが、確かにあなたの髪を失うことなく実行可能にします。

Clojureは確かに実行可能なオプションですが、その優れた同時実行ツールを使用しても、別のものを構築する必要がある場合があります。例については、Prismaticを確認してください。

私たちのバックエンド言語の選択は、JVM上のClojureです。ScalaのようなJVMには他にも優れた関数型言語がありますが、Clojureの優れている点は、永続的なデータ構造の優れたセット(または変更可能なjava.utilの同等物)で表されるデータの処理に焦点を当てた小さくシンプルなコアがあることです。必要がストライキしたとき)。Clojureのコアを多用していますが、pmapのような関数にはニーズに十分対応できる細かい制御がないため、同時実行プリミティブ(atoms、refs、STMなど)は使用していません。代わりに、優れたjava.util.concurrentパッケージの上に独自の同時実行抽象化をClojureで構築することを選択します。

本当にワイルドになりたいのなら、Julia Programming Languageもチェックしてください。

ジュリアは、ユーザーに特定のスタイルの並列処理を課しません。代わりに、分散計算のためのいくつかの主要なビルディングブロックを提供し、多数の並列処理スタイルをサポートするのに十分な柔軟性を提供し、ユーザーがさらに追加できるようにします。


2

Jan Hudecが書いたものに加えて、関数型プログラミングスタイルに加えて、命令型/オブジェクト指向プログラミングスタイルもサポートするScalaについて言及したいと思います。

Scalaはアクターを介して並列処理を提供します(Erlangでも使用されます)。

セマフォ、ロックメカニズム、または他の同様の同時実行メカニズムを使用することは、Clojureの「自動」並列化に代わる優れた方法ではないと私は思います。

アクターは、基礎となるスレッド/プロセスから抽象化するオブジェクト指向の方法です。基本的に、オブジェクトは同時に実行され、互いにメッセージを送信するだけです。そのため、並列処理を実装するオブジェクト指向の方法が必要な場合は、アクターモデルをサポートする言語(またはフレームワーク)も調べます。

あなたはウィキペディアにいくつかのリンクを見つけることができます、Pythonには例えばPykkaがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.