La primera forma me parece inadecuada si estas trabajando sobre Python 2.x ya que creas una lista de 100000, si ya tienes definida la primera por que no usar esa ?
Con Python 3.x no tendras problema de memoria en este caso porque range retorna un objecto generador, que en lugar de crear la lista primero y luego iterar sobre ella, va iterando de manera perezosa lo que quiere decir que no carga en memoria la lista de N elementos.
En el ejemplo que esta mas arriba use
ndenumerate que es el metodo que ofrece numpy y por ende el mas optimizado para hacer el trabajo.