1

私はこのテストをしました

import time
def test1():
    a=100
    b=200
    start=time.time()
    if (a>b):
        c=a
    else:
        c=b
    end=time.time()
    print(end-start)


def test2():
    a="amisetertzatzaz1111reaet"
    b="avieatzfzatzr333333ts"
    start=time.time()

    if (a>b):
        c=a
    else:
        c=b
    end=time.time()
    print(end-start)

 def test3():
     a="100"
     b="200"
     start=time.time()

     if (a>b):
         c=a
     else:
         c=b
     end=time.time()
     print(end-start)

そして結果として得る

1.9073486328125e-06    #test1()
9.5367431640625e-07    #test2()
1.9073486328125e-06    #test3()

実行時間は似ています。確かに、文字列の代わりに整数を使用するとストレージ スペースが削減されますが、実行時間はどうでしょうか。

4

2 に答える 2

7

短いコードを 1 回実行するタイミングを計っても、ほとんどわかりません。特に、 と のタイミング数値を見るtest1、数値が同じtest3であることがわかります。これは警告サインであるはずです。実際、ここに表示されているのはタイマーの解像度だけです。

>>> 2.0 / 2 ** 20
1.9073486328125e-06
>>> 1.0 / 2 ** 20
9.5367431640625e-07

より良い結果を得るには、コードを何度も実行し、タイミングのオーバーヘッドを測定して差し引く必要があります。Python には、timeitまさにこれを行うための組み込みモジュールがあります。各種類の比較を 1 億回実行してみましょう。

>>> from timeit import timeit
>>> timeit('100 > 200', number=10**8)
5.98881983757019
>>> timeit('"100" > "200"', number=10**8)
7.528342008590698

したがって、違いはそれほど大きくないことがわかります (この場合、文字列の比較は約 25% 遅くなります)。では、なぜ文字列比較が遅いのでしょうか? それを見つける方法は、比較演算の実装を調べることです。

Python 2.7 では、比較はdo_cmp関数 inobject.cによって実装されています。tp_compare(このコードを新しいウィンドウで開いて、残りの分析を行ってください。) 817 行目で、比較対象のオブジェクトが同じタイプであり、クラス構造に関数がある場合、その関数が表示されることがわかります。と呼ばれます。整数オブジェクトの場合、これが起こります。関数はint_compareinintobject.cにあり、非常に単純です。

ただし、文字列にはtp_compare関数がないためdo_cmp、呼び出しに進み、最大 3 回try_rich_to_3way_compare呼び出しますtry_rich_compare_bool(3 つの比較演算子 EQ、LT、および GT を順番に試します)。これはtry_rich_compareを呼び出しstring_richcompareますstringobject.c

したがって、文字列比較は複雑な「豊富な比較」インフラストラクチャを使用する必要があるため遅くなりますが、整数比較はより直接的です。しかし、そうであっても、それほど大きな違いはありません。

于 2013-01-18T14:42:43.160 に答える
0

は?記憶空間が減少するので、比較する必要があるビット数も減少します。ビットを比較することは仕事であり、少ない仕事をすることはより速く進むことを意味します。

于 2013-01-18T14:15:33.347 に答える