The difference in performance between a generator expression and a list comprehension is easy to measure:
python --version && python -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join(obj.a for obj in l)" Python 2.7.12 10 loops, best of 3: 87.2 msec per loop python --version && python -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join([obj.a for obj in l])" Python 2.7.12 10 loops, best of 3: 77.1 msec per loop python3.4 --version && python3.4 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join(obj.a for obj in l)" Python 3.4.5 10 loops, best of 3: 77.4 msec per loop python3.4 --version && python3.4 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join([obj.a for obj in l])" Python 3.4.5 10 loops, best of 3: 66 msec per loop python3.5 --version && python3.5 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join(obj.a for obj in l)" Python 3.5.2 10 loops, best of 3: 82.8 msec per loop python3.5 --version && python3.5 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join([obj.a for obj in l])" Python 3.5.2 10 loops, best of 3: 64.9 msec per loop python3.6 --version && python3.6 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join(obj.a for obj in l)" Python 3.6.0 10 loops, best of 3: 84.6 msec per loop python3.6 --version && python3.6 -m timeit -s \ "import argparse; l = [argparse.Namespace(a=str(i)) for i in range(1000000)]" \ "''.join([obj.a for obj in l])" Python 3.6.0 10 loops, best of 3: 64.7 msec per loop
It turns out that list comprehension is consistently faster than the generator expression:
- 2.7: ~ 12% faster
- 3.4: ~ 15% faster
- 3.5: ~ 22% faster
- 3.6: ~ 24% faster
But note that memory consumption for list comprehension is 2x.
Update
Dockerfile you can run your equipment to get your results, for example docker build -t test-so . && docker run --rm test-so docker build -t test-so . && docker run --rm test-so .
FROM saaj/snake-tank RUN echo '[tox] \n\ envlist = py27,py33,py34,py35,py36 \n\ skipsdist = True \n\ [testenv] \n\ commands = \n\ python
source share