2017-11-07 1 views
0

私は10000-1000000回計算して値を反復し、その出力の一部をリストに追加するグラフ作成プログラムを作成しています。どのリストに追加するかを変更するには、そのループ内に〜3個のif文があります。最初にif文を使用する方が論理的に高速ですが、かなりの時間が節約できますか?一例として、if文がPythonでかなりの時間がかかりますか?

output = [] 
append_to = "pol" 
for i in range(10000): 
    if append_to == "pol": 
     output.append(np.cos(i)) 
    else: 
     output.append(np.sin(i)) 

これはよりも大幅に遅くなるだろう:

output = [] 
append_to = "pol" 
if append_to == "pol": 
    for i in range(10000): 
     output.append(np.cos(i)) 
else: 
    for i in range(10000): 
     output.append(np.sin(i)) 
+0

「append_to」の値が変わる可能性があると仮定すると、どちらが速いかにかかわらず、完全に同等ではないことに注意してください。 – DeepSpace

+1

ループ全体で 'append_to'は同じ状態を維持しますか?この場合、append_to == "pol" else np.sin'を定義し、次に 'output = list(map(f、range(10000))'を実行すると、f = np.cosを定義できます。 –

+0

はい、append_toは同じですなぜ、これが問題を無効にするのですか?私は最適化について尋ねています。ありがとう、私はマップ関数を調べる必要があります。 –

答えて

2

理由だけではなく、しようとしていけませんか?

import numpy as np 
import timeit 

def one(): 
    output = [] 
    append_to = "pol" 
    for i in range(10000): 
     if append_to == "pol": 
      output.append(np.cos(i)) 
     else: 
      output.append(np.sin(i)) 

def two(): 
    output = [] 
    append_to = "pol" 
    if append_to == "pol": 
     for i in range(10000): 
      output.append(np.cos(i)) 
    else: 
     for i in range(10000): 
      output.append(np.sin(i)) 

print(timeit.timeit('f()', 'from __main__ import one as f', number=1000)) 
print(timeit.timeit('f()', 'from __main__ import two as f', number=1000)) 

Output: 
9.042721510999854 
8.626055914000062 

はい、期待通りに高速です。また、参照にも時間がかかりますので、ap = output.appendを実行した後にをoutput.appendの代わりに呼び出すと、わずかな改善が得られます。

2

お試しください!

import math, time 

time_start = time.time() 

output = [] 
append_to = "pol" 
for i in range(10000000): 
    if append_to == "pol": 
     output.append(math.cos(i)) 
    else: 
     output.append(math.sin(i)) 

print("End: " + str(time.time() - time_start)) 

この実行のために、私は4.278sを得ました。この実行の場合:

import math, time 

time_start = time.time() 

output = [] 
append_to = "pol" 
if append_to == "pol": 
    for i in range(10000000): 
     output.append(math.cos(i)) 
else: 
    for i in range(10000000): 
     output.append(math.sin(i)) 

print("End: " + str(time.time() - time_start)) 

私は3.751sを得ました。

だからそこに行く!

関連する問題