You can easily verify this using the timeit module. In your specific example, the first len based solution looks faster:
$ 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
Even for large lists - but with most elements not matching your predicate - the len version does not look slower:
$ 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
In fact, even if most of the elements in this list are the same (so a large list of results is configured to switch to len ), the len version wins:
$ 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
However, it seems much faster to not have a list, if possible, but rather to keep it, for example. a collections.Counter . For instance. for 100,000 elements, I get:
$ 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