web-dev-qa-db-ja.com

Python Java / C#より遅い?

Python Java/C#より遅い?

performance-comparison-c-Java-python-Ruby-jython-jruby-groovy

CPythonを最適化するプロジェクトを次に示します。 nladen-swallow

67
yesraaj

言語とランタイムを統合しないでください。

Python(言語)には多くのランタイム実装があります。

  • CPythonは通常解釈され、ネイティブコードのC#よりも遅くなります。 Java JITコンパイラーによっては、Javaよりも遅い場合があります。

  • JYthonはJVMで解釈され、Javaと同じパフォーマンスプロファイルを持ちます。

  • IronPythonはC#と同じ.NETライブラリとILに依存しているため、パフォーマンスの違いは比較的小さくなります。

  • Pythonは、PyREX、PyToCなどを介してネイティブコードに変換できます。この場合、通常はC++と同様に機能します。ある程度、C++をさらに最適化し、おそらくPyREXからの最適化されていない出力よりもわずかに優れたパフォーマンスを引き出すことができます。

    詳細については、 http://arcriley.blogspot.com/2009/03/so-long-pyrex.html を参照してください

Python(言語)は遅くありません。一部のPythonランタイム(CPythonなど)はネイティブコードC++よりも遅くなります。

121
S.Lott

なぜPythonがJava/C#より遅いのかを問うのは本当に正しくありません。 Javaはどれくらい高速ですか?素朴なインタープリターは、最適化されたコンパイラーの約10倍遅いです。 JavaScriptで記述されたJava bytcodeインタープリターがあると思います-おそらくそれほど高速ではありません。したがって、意図された質問は、「CPython言語システムが同等のSun、IBM、Oracle JRE、およびMicrosoft .NETランタイムよりも遅いのはなぜですか」と思われます。

正解は技術的ではないと思います。最速のJavaおよび.NETランタイムは、大規模なフルタイムの技術チームがパフォーマンス競争環境で開発しているため、より高速です。

動的言語システムは簡単に実装できます。どんなバカでもできます。私が持っています。静的言語システムは、設計と実装がより複雑です。単純な静的システムは、同等の動的に機能する同等のシステムよりもはるかに高速に動作する傾向があります。ただし、高度に最適化された動的システムをほぼ同じ速度で実行することは可能です。いくつかのSmalltalkの実装が非常に優れていることを理解しています。開発された動的システムのよく引用される例は、 MIT LISP Machine です。

さらに、本当のうなり声がライブラリコードによって行われている場合、言語システムは重要ではありません。あるいは、この言語は、一定の要因のパフォーマンスの違いを簡単に一掃できる、より効率的なアルゴリズムの開発を奨励する(または時間を与える(!))場合があります。

59

他の回答で述べたように、これは実行時のシステムと手元のタスクに依存します。そのため、標準の(C)Pythonは、必ずしもJavaまたはC#。よりも遅くありません。そのモジュールの一部はCで実装されています。したがって、nativePythonの言語による実装。

小規模な実験を行いました。さまざまな言語で要因計算の実行時間を比較しました。このテストは、実際には、任意精度の整数実装のパフォーマンスを評価することを目的としていました。

受験者。言語任意精度整数ランタイム
 
 1. Java Java.math.BigInteger JRE 6.13 
 2. .NET System.Numerics。 BigInteger MS CLR 4.0 
 3. Python long Active Python 2.6.2.2 
 4. BigInt Squeak 3.10.2 
 5. .NET Mono.Math.BigInteger MS CLR 4.0 
 
 results:
 
 1)2)3)4)5)
 10.000! 343 ms 137 ms 91 ms 1.200 ms 169 ms 
 20.000! 1.480 ms 569 ms 372 ms 1.457 ms 701 ms 
 30.000! 3.424 ms 1.243 ms 836 ms 3.360 ms 1.675 ms 
 40.000! 6.340 ms 2.101 ms 1.975 ms 6.738 ms 3.042 ms 
 50.000! 10.493 ms 3.763 ms 3.658 ms 10.019 ms 5.242 ms 
 60.000! 15.586ミリ秒7.683ミリ秒5.788ミリ秒14.241ミリ秒10.000ミリ秒

代替テキストhttp://www.mycsharp.de/wbb2/attachment.php?attachmentid=6909&sid=0d5aa62b522d005d9e7089785b5d19f1

棒グラフに結果が表示されます。 Pythonが明確な勝者です。私が知る限り、Pythonは Karatsuba-algorithm を使用して大きな整数を乗算します。速度。

また、Pythonの「任意精度整数」タイプは組み込みのlongです。したがって、JavaのBigIntegerクラスに必要な特別な型処理さえ必要ありません。

37
wierob

単純に-Pythonは遅い

どのインタープリター(現在使用可能)を使用しても、JavaおよびCよりも低速です。さまざまなベンチマークでは、RubyおよびPHPよりも低速です。他人の答えに依存し、自分自身をチェックして検証します。

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=python3&lang2=Java&data=u64q

個人的には、pythonより高速になりました。pythonで生産性が向上し、いくつかの問題を解決しました。速度/パフォーマンスは真剣に考慮されていません。アーキテクチャの問題がいくつかありすぎて、Pythonパフォーマンスの調整を妨げています。

免責事項-この答えはおそらくPython恋人。私もPython開発者は、Spring(Java)よりもDjango/Flask/Pyramidでwebappsを開発するのが大好きです。しかし、私の仕事と経験では、Pythonが遅い。しかし、私は彼らと一緒に立ちます。彼は、Python通訳者は少なくともマラソンに立つために給油と給油またはエンジンの全変更を行うべきです。これは主流のプログラミング言語です。

25
Ravi Kumar

コメントで示唆されているように、あなたは本当にテストケースを提供するべきです。パフォーマンスの違いの背後にある理由は、実行されているテストによって異なります。

ただし、静的な性質と動的な性質は、それと多くの関係がある可能性が高いことをお勧めします。非仮想呼び出しの場合、JITでコンパイルされたC#/ Javaは、JIT時に正確に判断できるため、非常に安価です。仮想コールでさえ、単一レベルのリダイレクトのみを伴います。バインディングが動的になった場合、考慮すべき事柄の範囲が広がります。

Pythonの正確な実行時の動作を理解すると主張するには、バージョンや実装によっても異なる可能性があると思われます。「Pythonバイトコード」などの詳細がありますその後、仮想マシンによって実行されます-この仮想マシンが実際にJITコンパイルを実行するかどうかは別の問題です。

15
Jon Skeet

要するに、コンパイル段階では処理する情報が少ないため、アヒル型(動的型付き)言語の場合、ランタイムはより多くの作業を行う必要があります。

したがって、メソッド呼び出しfoo.bar()を作成している場合、JavaまたはC++の場合)barへの呼び出しは、「foo」のタイプを検出することでコンパイルプロセスで最適化できます。 pythonまたはその他の動的に型付けされた言語コンパイラは、オブジェクトfooがどの型に属しているかを知らないため、コンパイラがそれを見つけることができるメモリ位置でメソッドを直接呼び出します。実行時に型チェックを実行してから、barメソッドのアドレスを検索して呼び出します。

pythonコンパイラの作成者も苦労していますが、上記のものは適切に指示を与えてくれることを願っています。したがって、最高のコンパイラ作成者であっても、静的に型付けされた言語はランタイム。

動的に型付けされた言語のスコアは通常、開発時にあります。記述および保守するコード行が少なく、開発者のコ​​ンパイル待ち時間がないため、多くの場合、開発ははるかに高速になります。

14
Dhananjay Nene

PythonでJavaと書く明確な例があります:

 def __init__(self,size):  
     self.first = None  
     last = None  
     for i in range(size):  
         current = Person(i)  
         if self.first == None : self.first = current  
         if last != None :  
             last.next = current  
             current.prev = last  
         last = current  
     self.first.prev = last  
     last.next = self.first  

もう少しPythonic:

 def __init__(self,size):  
     chain = [Person(i) for i in range(size)]
     self.first = chain[0]
     chain = Zip(chain, chain[1:].append(chain[0]))
     for p,n in chain:
        p.next = n
        n.prev = p
9
vartec

最終的には、Pythonは最適化で可能な限り遠くまで行かない。一般的な最適化手法のほとんどは静的言語用である。Thereare動的言語の最適化手法ですが、現代の言語は可能な限りそれらを使用していないようです。SteveYeggeには優れた 主題に関するブログ投稿 があります。

[〜#〜] edit [〜#〜]:私は、これが必ずしもPythonに批判的であると述べているわけではないことを指摘したかっただけです。私は不必要な速度よりも単純さを好む。

6
Jason Baker

言語自体とは何の関係もありません。それはJava 実装およびランタイムシステム(JVM)が非常に高品質であり、その多くのリソースが長年にわたって安定性、スケーラビリティ、パフォーマンスの改善に投資されてきました。

これとは対照的に、CPythonの実装が最近実装されたばかりで、たとえばインタープリターにスレッドディスパッチを実装したため、特定の問題に対して最大20%のパフォーマンス向上が得られました。それは聞こえるので良いことではありません、そのような基本的な最適化はその日からそこにあるべきであるので悪いです。

5
Marko

この種の質問は定性的な推論だけでは答えられません。それを裏付けるには良いベンチマークが必要です。以下に比較する1つのセットがあります Python 3 vs C#Mono and find Pythonは3から300倍遅くなります。Python vs. Java結果は同様です。(ベンチマークの解釈に関する通常の注意が適用されます。)

これらのベンチマークは、ソースコードのサイズも報告し、Pythonは、JavaおよびC#。

3
Jim Ferrans

解釈され、コンパイルされないため..実行時間が遅くなります。

Code Complete(second edition) book、page 600で言及されている表として、

実行時間(1:1)のC#はC++と同じです。そして、Pythonは実行時間(> 100:1)でC++よりも100倍以上遅いです。

そしてJavaはC++よりも1倍(1.5:1)遅い。

これらの統計は平均です。誰がこの研究をしたのかわかりませんが、興味深いようです。

2
Saleh Al-Zaid

Pythonコードを書くことの簡単さと単純さは、より複雑なコード、例えば、マルチコアプロセッサを活用するコードを書くことを可能にする。過去5〜10年間ほとんど停滞していたため、Pythonプログラム(CPythonで実行されているかどうか)が長期的には遅いことは明らかではないと思います。

1
DNS

私は反対だと思います。私はPython Javaよりも速くPython $ ===で簡単なプログラムを実行できます。これらのPythonスクリプトは非常に高速に動作します。

もちろん、例のないあなたの質問に答えるのは難しいです。遅いライブラリやバグなどを見つけたかもしれません。詳細を教えてください。

1
Michał Niklas