アルゴリズムプログラミングのためのC上のPythonの優先


16

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

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

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

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

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


私は、これらの言語を業界で使用したことのある人々から、および/または大規模なソフトウェア/ライブラリなどを開発したいのです。


このトピックでは、この議論へのリンクなしで完全ではないでしょうlukeplant.me.uk/blog/posts/...
permeakra

11
@permeakra:それはただの暴言であり、基本的にHaskellとPythonを学ぶことは他の言語であなたを良くするものではないと述べている。
ロバートハーベイ

PythonとHaskellがユーザーの心にどのように影響するかについての説明、およびそのトピックに関する他の人々の多くのコメントが含まれているため、単なる暴言ではありません。ただし、cを低レベル言語として比較では使用しませんが、もう少し高レベルの言語ですが、アイデアは同じです-他の言語のアイデアを現在作業中の言語に持ち込み、コードを非慣用的にします。これは...良いことかもしれませんが、
permeakra


これが何であれ、少しの非アルゴリズムプログラミングを見るのは面白かったでしょう。
SKロジック

回答:


14

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

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

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

他の言語でそれらのスキルを学ぶことができますか?確かに、Cは間違えたときにそれをより明確にすることで役立ちます。

そうは言っても、私はCで同じくらい快適であるにもかかわらず、アルゴリズムプログラミングにPythonを使用します。Pythonにはそのようなプログラミングに非常に適した言語機能があり、パフォーマンスの違いは通常無視できます。両方を知っている他のプログラマーがCを選択する理由について話すことはできません。


1
「彼らはそれらの抽象化を提供することに慣れすぎています。」これは、私がCの前にpythonを学んだため、それらの行に沿って適応することができない、または何かを前提としているのでしょうか?
駆け巡って

10

プログラミングを主な目的としない研究者は、Pythonなどの高レベル言語を好みます。これは、Cなどの言語よりも簡単にソリューションをコーディングできるためです。Pythonは、「プロトタイプ」指向であるため、これに特に適しています。 「バッテリーが含まれています」。NumPyやSciPyなどの数値ライブラリーと統合します。

研究者がより良いパフォーマンスを必要とする場合、彼らは通常Pythonで作成したアルゴリズムをソフトウェアエンジニアに引き渡します。


基本的に、研究者とソフトウェアエンジニアはデザイナーと職人の関係がありますか?そして、業界の両方のタイプの人々の利用についてはどうですか?
フレドリング

9
重要なことは、Pythonでアルゴリズムをコーディングし、Cでより洗練された実装を記述することは、完全に受け入れられるシナリオだと思います。
ロバートハーベイ

または「Cythonでの再コーディング」ですか?
エンドリス14年

10

SPOJ.pl、ACMコンペティション、および同様のすべてのコンペティションは、コンペティションの直後に破棄される作業コードを高速で作成することに焦点を当てていることに留意してください。TopCoderはこれを行いますが、程度はより小さくなります(コードは、OOデザインレベルで少なくとも適切に編成されています)。

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

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

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

すでに提案したように、Pythonが遅すぎることが判明した場合は、いつでもPython実装をC実装と交換できます。しかし、これはおそらく巨大なプロジェクトで2〜3回発生するため、Cで開始することは、選択する言語でない限り(そして、そうでないことを示していない限り)時間の浪費になる可能性があります。


1
実際の数学を集中的に使用するアプリケーションを作成している場合、インタープリター言語のパフォーマンスが大幅に向上するため、CまたはC ++(「C / C ++」などはありません)を選択することはほぼ確実です。数年前にTopcoderを調べましたが、リークなどのマイナーな詳細をコンテストが気にしなかったため、メモリリークのみが必要な多くのC ++を見たことを覚えています。感動しませんでした。
ジムでテキサス州

正確に私のポイント。それは優先順位の問題です。トップコーダーはメモリリークを気にしません。カーネルはとにかくそれらをクリーンアップするからです。時間を節約できれば、彼らは悪い習慣やアンチパターンを気にしません。
K.ステフ

2
あなたの最後の段落は、「それを機能させ、それから速くしなさい」という黄金のルールを体現しています。
Carson63000

9

TopCoderの長年のメンバーであり、時折SPOJのユーザーである私は、競技会で他の言語よりもC / C ++を好む主な理由は、その生の速度であると言えます。プログラムの実行がタイミングを合わせると、アルゴリズムのコーディングの面で余裕が生まれるため、取得できる「最速の」言語を選択するという大きなプレッシャーがあります。TCでの私の進歩は、JavaからC#、C ++へと進みました。

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

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


あなたはTCとSPOJのユーザーですから。コードにpythonを使用する場合、時間とシンプルさのトレードオフは非常に大きくなりますか?つまり、Cを使用して同じアルゴリズムを正常に送信できる場合、Pythonを使用して正常に送信できますか?(はい、それは質問ごとに大きく異なる可能性がありますが、ほとんどの場合またはいくつかだけで不利な点があるでしょうか?)
ffledgling

@Ayos TCやSPOJのコンテキストでPythonを使用したことがないため、Pythonについて話すことはできませんが、C#やJavaに対するC ++の利点は、たまにしか重要ではなく、それでもそれほど重要ではありません。C ++からC#にコーディングされたアルゴリズムの単純なポートがタイムアウトで失敗したが、それは練習室にあった1つのケースしか思い出せません。ほとんどの場合、正しいアルゴリズムを発見することが、成功した送信と失敗した送信を区別する唯一のことです。
dasblinkenlight

1
Python、Ruby、Perlなどのインタープリター言語は、JavaやC#などのコンパイルされた高レベル言語(それ自体はCと比較して遅い)よりも数倍遅いことに注意してください。ただし、最終的には、非常に大きなデータセットを使用するか、リアルタイムの速度が必要な場合を除いて、実際には問題になりません。
KChaloux

5

CIでコードを書くために座るたびに、約15分後にあきらめます。これは面倒で、Pythonに移行する傾向があるためです。

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

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

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

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

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


3
「CおよびC ++ジョブは大幅に減少しました」。え?私は反対の傾向を見ているように、これは青から外れているようです。その文のソースを述べることができるまで-1。

3

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


あなたはヒップスターか何かですか?これがあなたのPBRです。私?私はむしろクールになりたいです。
トーマスエディング

2

C / C ++よりも「高」レベルの言語でプログラミングする場合に欠けているのは、コンピューターの動作を学習することです。組み込みシステム、運用システム、ハードウェアドライバーなどを開発することはできません。Cを知ることは、アセンブラーの学習にも役立ちます。

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


問題は、金属に近い側面ではなく、アルゴリズムに関するものでした。
コンラッドルドルフ

@KonradRudolphまあまあですが、ほとんどの場合、ハードウェアドライバーの記述はアルゴリズムと非常に密接に関連しています。たとえば、A / Dコンバーター用のドライバーを作成する場合、デジタルフィルターを開発する必要があり、場合によっては何らかのキューシステムまたは優先システムも開発する必要があります。そして、ドライバーの上にあるAPI。これは、「オブジェクト」または「抽象データ型」を記述することに非常に似ています。

@Lundin現実のシナリオの欠点について言及してくれてありがとう。
フレドリング

1

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

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

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

したがって、Pythonだけを使用することの欠点は、Cモデルのようなコンパイラモデルへのコンパイルを想定して記述されたアルゴリズムの利点を享受することが困難な場合があることです。Cだけを使用することの欠点は、あなたが述べたとおりです。それは、書くこととデバッグすることの豚であり、あなたはあなた自身のライブラリを頻繁に書く必要があります。

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


最初の段落には同意しません。Pythonはデータ構造に重点を置いており、事前定義されたデータ構造の実装方法を明確に文書化します。もちろん、ガベージコレクションはランタイムをゆがめますが、ビッグOオーダーをめったにゆがめません。
コンラッドルドルフ

1

ScalaまたはClojureをご覧になることをお勧めします(ただし、型注釈を使用します)。Cは、他のケースでは、彼らはまだあるとしていくつかのケースでは、彼らは速いとすることができ非常に、より速く、その後のRuby / Pythonの非常にconsiceと明確な表記持ちながら C(とは異なり、私見を)。これとCのコードを検討してください。

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

また、彼らは、Rubyの/ Pythonのと同様の機能プログラミング工廠持ってmapfilterreduce反復または末尾呼び出し再帰が、しかしそれは、その後、まだ完全に動的なスクリプト言語もはるかに高速であるほど速くないなど。


1

私は、これらの言語を業界で使用したことのある人々から、および/または大規模なソフトウェア/ライブラリなどを開発したいのです。

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

ライブラリはC ++で構築されています。C++は、このライブラリの特定の要件およびアルゴリズムライブラリ全般にほぼ完璧であるためです。別のアルゴリズムライブラリを開発し、言語の選択が私の場合、ほぼ確実にC ++を再度選択します。

その理由はパフォーマンスだけでなく、強力な型システムでもあるため、まず第一に型の安全性が高まり、第二に、使用するアルゴリズムを型に文書化できるようになります。これにより(私の経験では)読みやすさと保守性が大幅に向上します。

とはいえ、単純なアルゴリズムの落書きとパズルには、C ++で問題を最もうまく定式化する方法を具体的に試したい場合を除き、ほとんど常にPythonを使用します(はい、ほとんど擬似コードのように読み取れるため)。これまでのところ、SPOJやTopCoderの問題の多くは解決していないため、パフォーマンスが非常に重要であるため、高速言語を使用することが重要かどうかはわかりません。

しかし、通常は、合格するためにアルゴリズムを正しく取得することが重要です。そのような場合、Pythonは問題なく動作します。たとえば、プロジェクトオイラーの問題(タイミングが合わず、正しいソリューションのみがカウントされる)の場合、Pythonは完全に適しています。

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