0

私の友人と私は同じことをするプログラムを作りました。彼はJavaで、私のものはPythonでした。私たちが解決しなければならなかった問題は、「1 から 20 までのすべての数で割り切れる最小の正の数は?」というものでした。私たちは両方とも正しい答えを得ました。私が知る限り、実装はかなり似ていましたが、彼の答えは約 3 秒で終了しましたが、私の答えは 1 分以上かかりました。なぜこれが起こったのか、誰にもわかるでしょうか?明確にするために、どちらの方法も最善ではないことはわかっていますが、どちらもうまくいきました。私が興味を持っているのは、なぜそんなに大きな時間差があったのかを調べることです. ありがとう!

ジャワ:

for (int i = 1; i > 0; i++) {
    for (int j = 1; j < 21; j++) { 
        if (i % j != 0) {                  
            break;
        }
        if (j == 20) {
            System.out.println("ANSWER: " + i);
            System.exit(0);
        }
    }
}

パイソン:

e=1
while e > 0 :
    num =1
    while num < 21:

        if e % num != 0:
            break
        num += 1



    if num == 21:
        print e
        break
    e += 1
4

2 に答える 2

6

Python での実装は似ていますが、インデントは非常に重要です。Java バージョンでは、このブロック:

if(j == 20){
    System.out.println("ANSWER: " + i);
    System.exit(0);
}

2 番目の for ループ内にあります。Python バージョンでは、ブロック:

if num == 21:
    print e
    break

2 番目の while ループの外にあります。

于 2013-07-16T14:51:29.997 に答える
3

ほとんどの Java 実装は、バイト コードをマシン コードにコンパイルします。そうでない場合でも、Java のバイト コードは基本的なマシン操作に比較的密接に対応しています。さらに、もちろんintJava の は基本的なマシン タイプです。Python では、これはクラス型であり、必要に応じてオーバーフロー検出と long int への変換が完全にサポートされ、追加のための関数呼び出しがあり、関数は型のマップで検索されます。

編集:

私が言っていることをより明確にするためにi += 1、Python、++ iJava での形式のステートメントを考えてみましょう。JIT コンパイラがない場合、Java のバイト コードは次のような形で再開されます。

push i
push 1
add
pop i

バイト コードは、大きなスイッチによって実行される可能性があります。上記のバイト コード命令のそれぞれは、多くても 2 つまたは 3 つのマシン命令を使用します。のアドレスはiバイトコードにコンパイルされ、変数自体はint32_tC の an に相当します。

Python では、同等の擬似コードは次のようなものになります。

look up i in the module's dictionary.
look up __add__ in the resulting object's dictionary.
call the i.__iadd__( int(1) )

i.__iadd__値を追加するだけでなく、オーバーフローをチェックし、必要に応じて型を long に変換します。

つまり、最悪の場合 (JIT コンパイラーを使用すると、このための Java コードは Intel プロセッサー上で 1 つの機械語命令になるため)、Java の 10 ~ 20 個の機械語命令について話していることになります。Python の機械語命令の数は簡単に数千に及ぶ可能性があります。

于 2013-07-16T14:55:42.373 に答える