2017-10-06 5 views
1

ソートアルゴリズムの平均実行時間を計算するためにこれを書いたのですが、 をリファクタリングする方法があれば簡単です。並べ替えアルゴリズムの実行時間を計算するためのリファクタリング - python

time = [] 
for i in range(3): 
    start = timeit.default_timer() 
    insert_list = [] 
    for i in range(3000): 
     insert_list.append(randint(0,5000)) 
    sorted_list = merge_sort(insert_list) 
    stop = timeit.default_timer() 
    time.append(stop - start) 
print sum(time) /len(time) 
+0

あなたはおそらく(xrangeのを使用したい)(その場で数字を生成)()(数値の配列を生成します)。タイミングは、merge_sort()の時刻をチェックするだけで、リストを作成する時間は含めないでください。 – rcgldr

答えて

1

アルゴリズムの実行時間を測定するためにdatetimeを使用してみてください。

datetime.datetimeのは

from datetime import datetime 
    startTime = datetime.now() 
    #CODE 
    print("Time taken:",datetime.now() - startTime) 
1

まず、あなたは(datetime.datetime.now使用することを選択した場合に使用することができますマイクロ秒の属性)を持って、あなたは時間測定の外for i in range(3000)サイクルを移動する必要があります。これは並べ替えではないため、実際にデータセットの集団を測定します。また、乱数を使用すると、エントロピーのソースの速度(例えば/ dev/random、/ dev/urandomなど)に大きく依存します。共有ホスト、またはクラウド内)。ソートアルゴリズムの速度とは関係がありません。

time = [] 
for i in range(3): 
    insert_list = [] 
    for i in range(3000): 
     insert_list.append(randint(0,5000)) 
    start = timeit.default_timer() 
    sorted_list = merge_sort(insert_list) 
    stop = timeit.default_timer() 
    time.append(stop - start) 
print sum(time) /len(time) 

それほど重要ではない第二に、このタイマーなどの時間帯のシフト、夏時間、NTP時間調整の場合には、予期しない結果を与えることができます(datetime.now() & time.time()ように)使用する、monotonic.monotonic()を使用することをお勧めし可能であれば、OSは単調な時間の源泉である。しかし、これは外部のライブラリであり、組み込みではありません。

time = [] 
for i in range(3): 
    insert_list = [] 
    for i in range(3000): 
     insert_list.append(randint(0,5000)) 
    start = monotonic.monotonic() 
    sorted_list = merge_sort(insert_list) 
    stop = monotonic.monotonic() 
    time.append(stop - start) 
print sum(time) /len(time) 

第3に、測定値は、それぞれの呼び出しを別々に測定する場合、外部環境の影響を受ける可能性があります。あまりにも小さなデータセットで高速すぎるアルゴリズムなど、時間クロックの精度による測定の丸めにつながります。代わりに、N個の並べ替え呼び出しを行い、サイクル全体の時間を測定します。次に、合計時間を操作数で除算します。これは、事前にすべてのN個のアレイを準備する必要があるため、メモリを犠牲にしています。

N = 3 
dataset = [] 
for i in range(N): 
    insert_list = [] 
    for i in range(3000): 
     insert_list.append(randint(0,5000)) 
    dataset.append(insert_list) 
start = monotonic.monotonic() 
for insert_list in dataset: 
    sorted_list = merge_sort(insert_list) 
stop = monotonic.monotonic() 
print (stop - start)/N 

timeit.timeit()機能を使用しない理由第四に、?代わりに、範囲の

N = 3 
dataset = [[randint(0, 5000) for j in range(3000)] for i in range(N)] 
print(timeit.timeit(lambda: merge_sort(dataset.pop()), number=N)) 
関連する問題