I experimented a little bit with list comprehensions and the filter()
function today, because I was interested to see if there are significant efficiency improvements if using one over the other.
The results are a little bit confusing. When I filtered for even numbers, list comprehensions outperformed the traditional nested structure and the filter()
function by ~1.5x (i.e., it was ~1.5x faster).
But when I was using a function to check if a number was a prime number or not, the filter()
function was suddenly the fastest.
I posted more details below, and I uploaded the code at github if you want to try it out yourself: https://github.com/rasbt/list_comprehension_test
I tested the code with different range maximum values n
multiple times to make sure that the results are consistent and not affected by some temporary background process on my machine.
My questions:
- Any idea why filter function is so slow when filtering for even numbers? Could it be, because of the lambda function or because I am converting the generator object into a list?
- why are the results for the is_prime function so similar, and why is the filter function the fastest here?
1st Part: collecting even numbers
a) loop and else-if
even_nums = []
for i in range(1, n):
if i % 2 == 0:
even_nums.append(i)
b) list comprehension:
even = [i for i in range(1, n) if i % 2 == 0]
c) filter() function
even_nums = list(filter((lambda x: x%2 != 0), range(1, n)))
results for is_even
- loop and else-if: 1x (reference)
- list comprehension: 1.5x faster
- filter() function: 0.9x faster
2nd Part: Collecting Prime Numbers
def is_prime(num):
""" Returns True if input integer is a prime number. """
prime = True
if num < 2:
prime = False
elif num == 2:
prime = True
else:
for i in range(2, num):
if num % i == 0:
prime = False
break
return prime
a) loop and else-if
primes = []
for i in range(1, n):
if is_prime(i):
primes.append(i)
b) list comprehension:
primes = [i for i in range(1, n) if is_prime(i)]
c) filter() function
primes = list(filter(is_prime, range(1, n)))
results for is_prime
- loop and else-if: 1x (reference)
- list comprehension: 0.98x faster
- filter() function: 1.13x faster