import numpy as np
def f(size):
    a = np.zeros(size) # pre-allocate arrays
    for i in range(size):
        a[i] = 2 ** i
    return a
def g(size):
    return 2.0 ** np.arange(size)
%timeit f(1000)
284 µs ± 4.03 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
%timeit g(1000)
3.49 µs ± 26.8 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
def h(size):
    l = []
    for i in range(size):
        l.append(2 ** i)
    return l
%timeit h(1000)
229 µs ± 2.17 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
def h(size):
    l = [0] * size
    for i in range(size):
        l[i] = 2 ** i
    return l
%timeit h(1000)
232 µs ± 3.43 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)