2017-01-08 5 views
0

ループ内の特定の計算でリストの長さを使用する必要があるとします。各計算でlen(list_)を使用するか、長さlength = len(list_)を保存してからlengthを使用する方が速いですか?たとえば:リストの長さをループの前に一度計算するのは、ループの中でそれを再計算するよりも速いのですか?

for x in range(n): 
    print(len(list_) + 1) 

length = len(list_) 
for x in range(n): 
    print(length + 1) 

対は、一般的な状況を( nは任意の値を指定できます)とします。

+5

'time.time()'を使ってテストして、私たちに報告してみませんか? – blacksite

+5

これを助けるために設計された[timeit](https://docs.python.org/3.6/library/timeit.html)モジュール全体があります。これは 'time.time( ) 'を導入することができます。 – DSM

+3

これらのコードブロックの唯一の違いは、変数へのアクセスとそれを別のアクセスされた変数との関数の呼び出しで単純に変数にアクセスすることです。それらの間の唯一の違いは、前者が関数を呼び出し、後者が2番目の変数にアクセスすることです。あなたはどちらが速いと思いますか?あなたが推測した推測をした後、いくつかのテストを実行して調べる。その後、結果を無視して、どんなコードでもきれいに見えます。 – TigerhawkT3

答えて

2

@DSMが示唆したようにここでtimeitを使用して簡単なテストです:

def direct_len(lst): 
    total = 0 
    for x in range(1000): 
     total += len(lst) + 1 

def precalc(lst): 
    length = len(lst) 
    total = 0 
    for x in range(1000): 
     total += length + 1 

if __name__ == '__main__': 
    import timeit 
    print(timeit.timeit("direct_len(list(range(100)))", setup="from __main__ import direct_len", number=10000)) 
    print(timeit.timeit("precalc(list(range(100)))", setup="from __main__ import precalc", number=10000)) 

を、私は、Windows 8上のPython 3.5との結果を以下の取得の上で:シングル格納された変数にアクセスする

1.3909554218576217 
0.8262501212985289 
+0

私はそれを知っていました。 'n '回目に' len'関数を繰り返さなければならないような最初の見た目です。 – akinjide

+1

実際に異なるコードのパフォーマンスの違いを隠す、同じオーバーヘッドのものをたくさんタイミングしていることに注意してください。 – TigerhawkT3

+0

私がこのプログラムを実行した場合、他のテストでコメントアウトされたテストの1つでこのプログラムを実行した場合、結果に大きな違いが生じるのではないかと思います。 – Tagc

-1

Pythonのリストには変数の長さが格納されているので、この2通りの方法で大きな違いはありません。

最初に長さを取得します(これは変数であり、len()関数では計算されません)。ループのたびに関数が1回だけ実行されます。私のテストでは時間は同じです。

+3

あなたのテストが何だったか教えてください。どうして彼らが同じであるかを知ることができますか?私のテストでは、保存された長さにアクセスすることは、 'len'を繰り返し呼び出すよりも約4倍高速でした。 – TigerhawkT3

0

ははるかに高速です関数にアクセスしてアクセスされた変数に渡すよりも

>>> import timeit 
>>> timeit.timeit('x', setup='x=len([1,2])') 
0.024496269777304097 
>>> timeit.timeit('len(x)', setup='x=[1,2]') 
0.10009170159894687 

しかし、私がcomment aboveで言ったように、それは問題ではありません。あなたが呼び出す機能が非常に高価なのかどうかは重要ですが、今回はそうではありません。あなたのコードをよりきれいに見せるものを使用してください。

関連する問題