0

他の言語と比較した Python のパフォーマンスに関する一般的な質問が多数あります。より具体的な例があります: python と c# で記述された 2 つの単純な関数があり、両方とも int 番号が素数であるかどうかをチェックします。

パイソン:

import time

def is_prime(n):
    num =n/2
    while num >1:
        if n % num ==0:
            return 0
        num-=1
    return 1

start = time.clock()
probably_prime = is_prime(2147483629)
elapsed = (time.clock() - start)
print 'time : '+str(elapsed)

およびC#:

 using System.Diagnostics;

 public static bool IsPrime(int n)
        {
            int num = n/2;
            while(num >1)
            {
                if(n%num ==0)
                {
                    return false;
                }
                num-=1;
            }
            return true;
        }
 Stopwatch sw = new Stopwatch();
 sw.Start();
 bool result = Functions.IsPrime(2147483629);
 sw.Stop();
 Console.WriteLine("time: {0}", sw.Elapsed);

そして時間(Pythonの初心者としての私にとっては驚きです:)):

パイソン: 121秒; c#: 6 秒

この大きな違いはどこから来るのか説明していただけますか?

4

1 に答える 1

0

型情報がなければ、Python は、その大きな while ループで実行するよりも、何をすべきかを調べることに多くの時間を費やします。

Python 構文を使用すると、いくつかの方法でこれをより高速に実行できます。

1) PyPy を使用します --- コードがどのように実行されているかを監視し、型を認識し、遅いルックアップをその場で高速なマシン コードに置き換えます --- かなりクールです

2) Numba を使用 --- これは標準の CPython ランタイムで動作するため、お気に入りの Python 拡張機能で使用できます。デコレーターを追加することで、関数が「型付けされた」もの (整数など) で呼び出されたときに、関数をマシンコードにプリコンパイルします。

PyPy のタイミングは取れませんでしたが、私のシステムでは Python コードに約 180 秒、numba コードに約 14 秒かかりました。

ナンバーコードは次のとおりです。

import numba
@numba.jit(numba.bool_(numba.int64), nopython=True)
def is_prime(n):
    num =n/2
    while num >1:
       if n % num ==0:
            return 0
        num-=1
    return 1
于 2013-06-25T22:19:50.980 に答える