Python 3.6 Timings
Here are the timing results using Python 3.6.8. Keep in mind these times are relative to one another, not absolute.
I stuck to only doing shallow copies, and also added some new methods that weren't possible in Python 2, such as list.copy() (the Python 3 slice equivalent) and two forms of list unpacking (*new_list, = list and new_list = [*list]):
METHOD TIME TAKENb = [*a] 2.75180600000021b = a * 1 3.50215399999990b = a[:] 3.78278899999986 # Python 2 winner (see above)b = a.copy() 4.20556500000020 # Python 3 "slice equivalent" (see above)b = []; b.extend(a) 4.68069800000012b = a[0:len(a)] 6.84498999999959*b, = a 7.54031799999984b = list(a) 7.75815899999997b = [i for i in a] 18.4886440000000b = copy.copy(a) 18.8254879999999b = []for item in a: b.append(item) 35.4729199999997We can see the Python 2 winner still does well, but doesn't edge out Python 3 list.copy() by much, especially considering the superior readability of the latter.
The dark horse is the unpacking and repacking method (b = [*a]), which is ~25% faster than raw slicing, and more than twice as fast as the other unpacking method (*b, = a).
b = a * 1 also does surprisingly well.
Note that these methods do not output equivalent results for any input other than lists. They all work for sliceable objects, a few work for any iterable, but only copy.copy() works for more general Python objects.
Here is the testing code for interested parties (Template from here):
import timeitCOUNT = 50000000print("Array duplicating. Tests run", COUNT, "times")setup = 'a = [0,1,2,3,4,5,6,7,8,9]; import copy'print("b = list(a)\t\t", timeit.timeit(stmt='b = list(a)', setup=setup, number=COUNT))print("b = copy.copy(a)\t", timeit.timeit(stmt='b = copy.copy(a)', setup=setup, number=COUNT))print("b = a.copy()\t\t", timeit.timeit(stmt='b = a.copy()', setup=setup, number=COUNT))print("b = a[:]\t\t", timeit.timeit(stmt='b = a[:]', setup=setup, number=COUNT))print("b = a[0:len(a)]\t\t", timeit.timeit(stmt='b = a[0:len(a)]', setup=setup, number=COUNT))print("*b, = a\t\t\t", timeit.timeit(stmt='*b, = a', setup=setup, number=COUNT))print("b = []; b.extend(a)\t", timeit.timeit(stmt='b = []; b.extend(a)', setup=setup, number=COUNT))print("b = []; for item in a: b.append(item)\t", timeit.timeit(stmt='b = []\nfor item in a: b.append(item)', setup=setup, number=COUNT))print("b = [i for i in a]\t", timeit.timeit(stmt='b = [i for i in a]', setup=setup, number=COUNT))print("b = [*a]\t\t", timeit.timeit(stmt='b = [*a]', setup=setup, number=COUNT))print("b = a * 1\t\t", timeit.timeit(stmt='b = a * 1', setup=setup, number=COUNT))