2

CodingBat.com で Python の質問を解決していました。文字列をn回印刷するという単純な問題に対して、次のコードを書きました-

def string_times(str, n):
    return n * str

公式結果は -

def string_times(str, n):
    result = ""
    for i in range(n):
       result = result + str
    return result

print string_times('hello',3)

出力は両方の関数で同じです。文字列乗算 (最初の関数) が for ループ (2 番目の関数) に対してパフォーマンス ベースでどのように実行されるのか興味があります。つまり、どちらがより高速で、主に使用されていますか?

また、この質問に対する答えを自分で得る方法を提案してください (time.clock() などを使用)

4

3 に答える 3

7

モジュールを使用してtimeitこれをテストできます。

python -m timeit "100*'string'"
1000000 loops, best of 3: 0.222 usec per loop

python -m timeit "''.join(['string' for _ in range(100)])"
100000 loops, best of 3: 6.9 usec per loop

python -m timeit "result = ''" "for i in range(100):" "  result = result + 'string'"
100000 loops, best of 3: 13.1 usec per loop

乗算がはるかに高速なオプションであることがわかります。文字列連結バージョンは CPython ではそれほど悪くありませんが、他のバージョンの Python ではそうではない可能性があることに注意してください。文字列の乗算を常に選択する必要がありますstr.join()。この理由は、速度だけでなく、読みやすさと簡潔さのためです。

于 2012-05-02T17:12:16.390 に答える
4

次の 3 つの関数の時間を測定しました。

def string_times_1(s, n):
    return s * n

def string_times_2(s, n):
    result = ""
    for i in range(n):
       result = result + s
    return result

def string_times_3(s, n):
    "".join(s for _ in range(n))

結果は次のとおりです。

In [4]: %timeit string_times_1('hello', 10)
1000000 loops, best of 3: 262 ns per loop

In [5]: %timeit string_times_2('hello', 10)
1000000 loops, best of 3: 1.63 us per loop

In [6]: %timeit string_times_3('hello', 10)
100000 loops, best of 3: 3.87 us per loop

ご覧のとおり、s * nは最も明確で簡潔であるだけでなく、最も高速です。

于 2012-05-02T17:13:55.490 に答える
2

コマンドラインまたはコードでtimeitを使用して、Python コードの一部がどれだけ高速かを確認できます。

$ python -m timeit "\"something\" * 100"
1000000 loops, best of 3: 0.608 usec per loop

他の機能についても同様のことを行い、比較します。

于 2012-05-02T17:05:51.977 に答える