あなたは簡単にtimeit
モジュールを使用してこれをテストすることができます。あなたの特定の例では、最初のlen
ベースのソリューションは、より高速であるように思われる:
$ python --version
Python 2.7.10
$ python -m timeit -s "x = [10,60,20,66,79,5]" "len([i for i in x if 60 < i < 70])"
1000000 loops, best of 3: 0.514 usec per loop
$ python -m timeit -s "x = [10,60,20,66,79,5]" "sum(i for i in x if 60 < i < 70)"
1000000 loops, best of 3: 0.693 usec per loop
さらに大きなリストに - しかし、ほとんどの要素があなたの述語に一致しないと - len
バージョンは遅くならないように表示されます。
実際に
$ python -m timeit -s "x = [66] + [8] * 10000" "len([i for i in x if 60 < i < 70])"
1000 loops, best of 3: 504 usec per loop
$ python -m timeit -s "x = [66] + [8] * 10000" "sum(1 for i in x if 60 < i < 70)"
1000 loops, best of 3: 501 usec per loop
、たとえ与えられたリストの試合のほとんどの要素は、(とても大きく、結果のリストがlen
に渡すように構成されている)、len
バージョン勝利:
$ python -m timeit -s "x = [66] + [65] * 10000" "len([i for i in x if 60 < i < 70])"
1000 loops, best of 3: 762 usec per loop
$ python -m timeit -s "x = [66] + [65] * 10000" "sum(1 for i in x if 60 < i < 70)"
1000 loops, best of 3: 935 usec per loop
しかし、できるだけ速いと思われるのは、可能であれば最初にリストを持たないことです。 a collections.Counter
。例えば。100000要素の場合、私は得る:
$ python -m timeit -s "import collections; x = [66] + [65] * 100000" "len([i for i in x if 60 < i < 70])"
100 loops, best of 3: 8.11 msec per loop
$ python -m timeit -s "import collections; x = [66] + [65] * 100000; d = collections.Counter(x)" "sum(v for k,v in d.items() if 60 < k < 70)"
1000000 loops, best of 3: 0.761 usec per loop
あなたは実際に*リストが必要ですか?そうでない場合、第2のバージョンはそれを作成することを避ける。 – jonrsharpe
ほとんどのpythonicは、時間/メモリが少ないことを意味するわけではありませんが、あなたは両方の質問について質問します。あなたは、最も有色であるか最も効率的であるかを知りたいですか? –
また、if i in range(61、70) 'を使用することもできます。 –