web-dev-qa-db-ja.com

アルゴリズムプログラミングではCよりもPythonを推奨

私は少しアルゴリズムを研究していて、SPOJ.pl TopCoderなどのサイトを見てきました。プログラマーはほとんどのアルゴリズムプログラミングコンテストでCまたはC++を好むことがわかりました。

最近、私はいくつかの問題を抱えています。私はCとPython=の両方を知っており、コードを書こうとするとき、ほとんどのアルゴリズムではCよりもPythonを好むようです。いつも座っているCIでコードを書くと、面倒でPythonに移行する傾向があるため、約15分後にあきらめます。マトリックスポインターなどを渡すことは、アルゴリズム自体を考えるために実際に利用できる無駄な時間のようです。

今では、Cは非常に重要な言語であり、多くのプログラマーにとってパンとバターであ​​ることを多くの人から聞いて聞いています。

私が知りたかったのは、この私のアプローチに欠点/結果/欠点などがあるかどうかです。

これはPython vs Cの議論ではありません。これは、使いやすさのためにCよりもpythonを優先するというこの特定の習慣が私に影響を与える方法に関する質問です。長期的には、他のプログラマー/コンピューター科学者。


業界でこれらの言語を使用した人や、大規模なソフトウェア/ライブラリなどを開発した人からの連絡をお待ちしています。

16
ffledgling

私の経験では、Cでのアルゴリズムのコーディングが非常に困難な場合、適切な抽象化を作成する代わりに、データ構造管理とアルゴリズムを密接に結合していることが原因であることがよくあります。たとえば、Push()およびpop()関数を作成する代わりに、どこでもリンクリストポインターを手動で操作します。彼らは、これらの抽象化を提供することに慣れすぎています。

この問題は、抽象化のレベルが低いほど顕著になりますが、密結合を認識できず、適切な抽象化を作成できない場合は、どのレベルでも問題になります。きれいで読みやすいアルゴリズムを作成できるようになるまでCでこれらのスキルを練習すると、使用するすべての言語に引き継がれます。

pythonプログラマーの間で時々見られるもう1つの問題は、大規模なパフォーマンスに適応するのが難しいことです。当然、パフォーマンスは主な問題ではありませんが、比較的小規模なアルゴリズムを実装する最もPython的な方法データ構造は、ギガバイト以上のデータを処理しているときにシステムを停止させる可能性があります。優れたCプログラマになると、どの言語でもこのような種類の問題に気づくのに役立ちます。

それらのスキルを他の言語で学ぶことができますか?もちろんですが、Cは、間違いを犯したときにそれをより明確にすることで助けになります。

そうは言っても、Cで同じくらい快適でも、選択肢がある場合はアルゴリズムプログラミングにpythonを使用します。Pythonには、その種類のプログラミングではそれを非常に良いものにします。パフォーマンスの違いは通常無視できます。両方を知っている他のプログラマーがCを選択する理由を私は話すことができません。

14
Karl Bielefeldt

プログラミングに主な関心がない研究者は、Pythonなどの高水準言語を好む。なぜなら、そのような言語では、たとえばCよりも簡単にソリューションをコーディングできるからだ。Pythonより「プロトタイピング」指向であり、「バッテリー付属」であり、NumPyやSciPyなどの数値ライブラリーと統合されます。

研究者がより優れたパフォーマンスを必要とする場合、通常、作成したアルゴリズムをPython=でソフトウェアエンジニアに渡します。ソフトウェアエンジニアは、それを最適化する方法を見つけます(Cでの再コーディングまで)。 。

10
Robert Harvey

SPOJ.pl、ACMコンペティション、および同様のすべてのコンペティションは、コンペティションの直後に破棄される実用的なコードを迅速に作成することに焦点を当てています。 TopCoderはこれを行いますが、程度は小さくなります(コードは少なくともOO設計レベルで適切に構成されています)。

ただし、プログラミングの現実の世界では、アルゴリズムによるプログラミングの競争で取るほとんどすべてのショートカットはアンチパターンです。これを念頭に置いて初めて、あらゆる種類の比較を行うことができます。あなたの例を見てみましょう:異なる関数間で多次元配列を渡します。競争環境では、適切な呼び出しの詳細を計算する時間を節約するために、配列をグローバルに宣言するだけです(たとえば、サイズを渡す必要があるか、それとも決定できるか)。実際のプログラミングでは、正反対のことをします。

だから、あなたの質問に、アルゴリズムに対してCではなくPython=を選択した場合の複雑な結果はありますか?いいえ、アルゴリズムにのみ興味がある場合は、同じことを行いますPython and C.関数型言語で実装すると、いくつかの違いが生じる可能性がありますが、アルゴリズムは同じです。

Cでアルゴリズムを実装することで得られる事実上唯一のことは、実行をより詳細に制御し、より低いレベルの抽象化を使用していることを保証することです。 Pythonには複雑さがほとんど隠されているので、これは小さなことではありません。しかし、問題がより高いレベルの抽象化で自明ではない場合、実行速度を失う可能性があるだけです。 、そしてほとんどの場合、あなたは本当にプログラムをできるだけ速くしようとするのではなく、単に学ぶだけです。

すでに提案したように、Python実装はC実装といつでも交換できます。Pythonが遅すぎることが判明した場合です。しかし、これはおそらく2-3巨大なプロジェクトでは時間がかかるので、Cで始めるのは時間の無駄かもしれません。

10
K.Steff

TopCoderの長年のメンバーであり、SPOJを時々使用するユーザーとして、競技会で他の言語よりもC/C++を選ぶ主な理由は、その素早い速度であると言えます。プログラムの実行が時間指定されている場合、アルゴリズムのコーディングに関してより多くのスラックが得られるため、取得できる「最速」の言語を選択するという大きなプレッシャーがあります。 TCでの私の進歩は、JavaからC#からC++へと進みました。

ただし、この状況は日常の開発よりも競争でより一般的です。最適なコードを書くことは普遍的に重要ですが、できるだけ早くコードを完成させ、できるだけ保守可能にすることの相対的な重要性は、通常、いくつかを節約します。 100 CPUサイクル。 Pythonでのコーディングに慣れている場合は、多くの場合、これが推奨されるソリューションです。

さらに、Pythonは、C++では利用できない高レベルの機能を提供します。それらを構築することは、多くの場合非常にコストがかかり、時には不可能です(たとえば、C++でリフレクションまたは自己変更コードを構築することを検討してください) )そのような場合、高級言語に依存することも最適なソリューションであることが判明する可能性があります。

9
dasblinkenlight

Cでコードを書くために座るたびに、約15分後に諦めます。面倒すぎてPythonに移行する傾向があるからです。

この生産性の向上は、CおよびC++ジョブが大幅に減少した一般的な理由です。

これは、使いやすさのためにCよりもpythonを優先するというこの特定の慣行が、私や長期的には他のプログラマー/コンピューター科学者にどのように影響するかについての質問です。

これには2つの主要な部分があります。 1つはアルゴリズムプログラミングです。アルゴリズムの表現にどの言語を使用するかは問題ではありません。アルゴリズム自体を操作し、適切な問題を適切な問題に当てはめることが重要な部分であるため、実際には問題はありません。

2番目の部分は生産性の向上です。時間をかけてより生産的になるものを使用することは良い習慣であり、あなたのキャリアの中であなたに利益をもたらすだけのものです。アルゴリズムをさまざまな言語で表現できることは非常に役立ちますが、その有用性は、言語が使用しているイディオムが必ずしもそれらの言語が何であるかではありません。

要するに、それについて心配しないでくださいです。アルゴリズムを表現するために何を使用するかは、アルゴリズムを表現できることほど重要ではありません。

5
Telastyn

PythonまたはRuby)のような高水準言語を使用する利点は、(1)構文が疑似コードに非常に近く、(2)標準ライブラリが便利であることです箱から出してすぐにデータ構造(@Robertが言及したバッテリーを含む概念)。したがって、それらを使用することを好むのはまったく問題ありません。主流または「クール」であるという理由だけで言語を選択するのではなく、生産性を最大化するものを使用してください。

3
sakisk

C/C++よりも「高」レベルの言語でプログラミングする場合、コンピュータがどのように機能するかを学習するときに見逃すことになります。組み込みシステム、オペレーティングシステム、ハードウェアドライバーなどを開発することはできません。 Cを知ることは、アセンブラを学習するときにも役立ちます。

また、すべてのミッションクリティカルなシステムの大部分はまだCで開発されているため、いくつかのソフトウェアソフトウェアブランチ(航空宇宙/自動車/医療技術など)では、知らないうちに作業することができない場合があります。

2
user29079

ScalaまたはClojure(ただし、型注釈を使用)を参照することをお勧めします。場合によっては、Cと同じくらい高速になることもあれば、それでもmuch Ruby/Pythonよりも高速非常に簡潔で明確な表記がある場合 Cとは異なり([〜#〜] imho [〜#〜])これとCのコードを比較してください:

for (i <- 1 to 100; j <- 2 until 100;
     k <- 1 to 2; if i != j) {
     //...
}

また、RubyやPythonのmapfilterreduceなどに似た関数プログラミングの武器を持っていますが、反復や末尾呼び出しの再帰ほど高速ではありませんが、それでもはるかに高速です。次に、完全に動的なスクリプト言語。

1
defhlt

業界でこれらの言語を使用した人や、大規模なソフトウェア/ライブラリなどを開発した人からの連絡をお待ちしています。

私は大きなC++ライブラリのほんの一部に数年取り組んできましたが、このライブラリのコンテキストで学士論文と修士論文の両方を書きました。ちなみに、ライブラリは、バイオインフォマティクスアルゴリズムとデータ構造のライブラリです。

C++はこのライブラリの特定の要件、および一般的なアルゴリズムライブラリに最適であるため、ライブラリはC++で構築されています。別のアルゴリズムライブラリを開発し、言語の選択が私のものだった場合、ほぼ間違いなくC++を再び選択します。

理由はだけでなくパフォーマンスだけでなく、最初に型の安全性を高め、次に型を許可する強力な型システムドキュメントアルゴリズムです。中古。これにより(私の経験では)、可読性と保守性が大幅に向上します。

とは言っても、単純なアルゴリズムの落書きやパズルでは、特に=問題を公式化する方法を特に試したいのでない限り、Pythonが主な理由は、疑似コードのように読み取れるため)を使用しますC++ではこれまでのところ、SPOJまたはTopCoderの問題の多くは解決していません。そのため、パフォーマンスが本当に重要であり、高速言語の使用が重要であるかどうかはわかりません。

しかし、通常重要なのは、合格するためにalgorithmを取得することです。これらの場合、Pythonは問題なく動作します。たとえば、プロジェクトのオイラー問題(時間は計測されず、正しい解のみがカウントされます)の場合、Python完全に適しています。

1
Konrad Rudolph

「ビッグO表記」について質問があり、それを試して測定する場合、Pythonで行う方法は、pythonは物事を実装します。たとえば、Pythonリストはリンクされたリストではありません。PythonのソートはTimSortです。Python特定の時間にガベージコレクションを実行します。 。

私は常に、Cプログラムをプロセッサで起こりそうなものに接続する方が簡単だと思っていますが、ここでもプロセッサキャッシュがあります。 OSのタイムスライシング。直感に影響を与える可能性のあるコンパイラの最適化など。

Pythonコードを記述してデバッグする方が速いので、選択肢が与えられたら、最初にPythonで動作するものを得ることに集中して記述します。これにより動作中のPythonプログラムを使用すると、大規模なシステムに組み込むことができ、それが機能したことだけでなく、十分に高速であるか、またはどの面で低速であったかを確認できます。実際のパフォーマンスデータを取得する速度を最適化するときに役立ち、Pythonバージョンを後でPythonまたはCなどで書き換えられたものに対してテストします。

したがって、Python=だけを使用する場合の欠点は、プロセッサモデルへのCのようなコンパイルを想定して記述されたアルゴリズムの利点を享受することが難しい場合があることです。Cのみを使用する欠点は、前述のとおりです。 :作成およびデバッグする豚であり、独自のライブラリを頻繁に作成する必要があります。

それらのトレードオフを感じるまで、両方(および他の言語)を使用するのが最善だと思います。私自身も優れたCコーダーでしたが、今ではオリジナルのCコードをほとんど記述していませんが、自分の仕事でCコードを読み取る(場合によってはデバッグする)必要があります。私はPythonを好みますが、PerlとAwk(およびsedとgrepとsort、およびTclとCと...)を知っていて、まだ使用しています。

1
Paddy3118