$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.repeat('for i in range(100): i**2', repeat=3, number=100000)
[4.451958370991633, 4.446133581004688, 4.4439384159923065]
>>> timeit.repeat('for i in range(100): pow(i,2)', repeat=3, number=100000)
[5.343420933000743, 5.341413081012433, 5.3455389970040414]
>>> timeit.repeat('for i in range(100): i*i', repeat=3, number=100000)
[0.8348780410015024, 0.8323301089985762, 0.8313860019989079]
$ python2
Python 2.7.6 (default, Nov 26 2013, 12:52:49)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.repeat('for i in range(100): i**2', repeat=3, number=100000)
[0.9710979461669922, 0.9630119800567627, 0.9619340896606445]
>>> timeit.repeat('for i in range(100): pow(i,2)', repeat=3, number=100000)
[1.7429649829864502, 1.7306430339813232, 1.729590892791748]
>>> timeit.repeat('for i in range(100): i*i', repeat=3, number=100000)
[0.6579899787902832, 0.6526930332183838, 0.6540830135345459]
$ python -m timeit '"-".join(str(n) for n in range(100))'; python -m timeit '"-".join([str(n) for n in range(100)])'; python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 49.4 usec per loop
10000 loops, best of 3: 40.6 usec per loop
10000 loops, best of 3: 32.8 usec per loop
$ python2 -m timeit '"-".join(str(n) for n in range(100))'; python2 -m timeit '"-".join([str(n) for n in range(100)])'; python2 -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 30.2 usec per loop
10000 loops, best of 3: 25 usec per loop
10000 loops, best of 3: 19.4 usec per loop
$ uname -rom
3.12.6-1-ARCH x86_64 GNU/Linux
Your benchmark results could use a little explanation.
I notice that all your examples involve using the range() function, which was changed from returning a list to a generator. In Python2 the memory usage is O(n) where as in Python3 it is O(1), albeit a little slower.
The first two cases being compared are 3-4x slower in Python 3 but why? Is it related to Integer->Float conversion? What has changed from Python 2 to 3 here?
The difference in the rest of the examples is not huge.
In my opinion, changing range, zip, map, etc to be "lazy", ie. return generators not lists, is one of the best things that happened in Python 3. What you lose in speed will be gained back in memory use.
These toy example micro benchmarks don't really prove anything, it's not like the cost of iterating a range of integers would ever be a bottle neck in a practical application. However, the advantage of O(1) vs. O(n) memory usage is a major benefit and will make zip, map and other related functions a lot more useful, especially for large lists.