2016-10-27 1 views
1

私はPythonには比較的新しいので、HackerRankの問題のためにいくつかのコードを最適化しようとしています。 range(つまりリストを生成する)を使うのは、反復する単一の変数を持つwhileループを使うよりも速いことが分かりました。再利用すれば範囲結果をキャッシュする必要がありますか?

range関数の結果をキャッシュする方が早いのかどうかは、コードの後半で同じシーケンスを反復処理するとうまくいきます。たとえば:


は、この高速です:

ten = 10 
zeroToTen = range(ten) 

sum = 0 
for x in zeroToTen: 
    sum += x 

product = 1 
for y in zeroToTen: 
    product *= y 

または私はちょうどrangeたびに思い出す必要があります。

ten = 10 

sum = 0 
for x in range(10): 
    sum += x 

product = 1 
for y in range(10): 
    product *= y 

答えて

2

python 3では、rangeがジェネレータです。これは、シーケンスのすべての数が得られることを意味します。それは簡単な追加です。

listcache = list(range(10))にキャッシュすることができますが、それはいくらかのメモリを割り当てるため、反復する必要があります。

BTW:最初の例では結果がキャッシュされません。ジェネレータ関数をコピーするだけです。

したがって、いいえ、rangeの結果をPython 3でキャッシュするのは便利ではありません(Python 2では、それは実際にはlistが作成されるので、有用です。

+1

'range'はシーケンスを返します。シーケンスは複数回使用できます。' r = range(5); print(リスト(r)、リスト(r)) '。 –

+0

@FranciscoCouzoは、 'range'イテレータ関数が(ファイルオブジェクトと異なり)それ自身をリセットする方法に興味があります。私は自分の投稿を編集した、私は間違いを言っていた。 –

2

それは、の大部分を顕著な違いをすることはありませんループ内で時間が費やされ、rangeオブジェクトは生成されません。

rangeはシーケンスを返します。つまり、リストに格納することなく、即座に値を生成します。

関連する問題