[N, N-1, ..., 0]
Pythonでリストを取得する最良の方法は何ですか? 私は2つの方法を考えています
>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(9, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[N, N-1, ..., 0]
Pythonでリストを取得する最良の方法は何ですか? 私は2つの方法を考えています
>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(9, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
range(N, -1, -1) is better
時間が大幅に短縮されていることがわかります。
N = 10000
%timeit range(N+1)[::-1]
1000000 loops, best of 3: 767 ns per loop
%timeit range(N, -1, -1)
1000000 loops, best of 3: 334 ns per loop
ではrange(N+1)[::-1]
、最初に とまったく同じことをrange(N, -1, -1)
行い、次にリストを逆にするため、時間がかかります。
数値のリストが潜在的に大きい場合、または実際にはリストが必要ではなく、範囲を反復するだけの場合は、次を使用して実際にリストを作成することを避けることができます
xrange(N, -1, -1)
以下のコメントで Rob が述べたように、この動作は Python 3 での新しいデフォルト (実際のリストではなくジェネレーターを返す) ですが、Python 2 ではrange()
リストxrange()
を返すものとジェネレーターを返すものがあります。
import timeit
print timeit.timeit("range(10)[::-1]", number=10000000)
print timeit.timeit("range(9, -1, -1)", number=10000000)
私のマシンでの出力
2.99922299385
2.24587512016
2番目の方が少し速いように見えるので、使用してくださいrange(9, -1, -1)
2番目の方法は、少し高速です。
%timeit range(9,-1,-1)
> 1000000 loops, best of 3: 496 ns per loop
%timeit range(10)[::-1]
> 1000000 loops, best of 3: 659 ns per loop