您可以使用
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
然而,如果可能的话,似乎更快的方法是一开始就不要有列表,而是使用例如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
if i in range(61, 70)
。 - pp_x
的每个元素是否在列表/迭代器[61, 62, 63, 64, 65, 66, 67, 68, 69, 70]
中。 - K. Menyah