matriz de escrita para se destacar em python com win32com

Estou fazendo um python que analisa arquivos de dados. Os dados analisados são então enviados para um arquivo do Excel. Os dados podem ser bastante grandes. Estou analisando de 10 a 20 colunas, mas o número de linhas pode ser bem superior a 100.000.

Escrever essa quantidade de dados para se destacar com o win32com leva uma quantidade considerável de tempo. Meu primeiro passo foi repetir todas as células do arquivo do Excel, o que consome muito tempo. Após algumas pesquisas, descobri como escrever uma linha com uma única ligação, reduzindo drasticamente o tempo necessário.

No entanto, quando eu preciso enviar 100.000 linhas de dados para o Excel, ainda levará muito tempo. Tenho certeza de que posso acelerar ainda mais isso enviando a matriz completa com uma única chamada. No entanto, não sou capaz de alcançar isso até agora.

Veja o código abaixo, que demonstra o problema. O código mostra as diferenças no tempo. No entanto, a terceira etapa, o envio da matriz completa com uma única chamada para um intervalo não está resultando nos dados corretos no Excel. O que estou fazendo errado?

import win32com.client
import time

#create data array
row = range(0,10)
i = 0
data_array = []
while i < 1000:
    data_array.append(row)
    i += 1

#write the array to an excel file
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True
excel.ScreenUpdating = False
book = excel.Workbooks.Add()
sh1 = book.Worksheets(1)
sh2 = book.Worksheets(2)
sh3 = book.Worksheets(3)

#double loop, writing individual cells
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    col = 0
    for field in line:
        col += 1
        sh1.Cells(row, col).Value = field
print "Processing time: " + str(time.time() - start) + " seconds."

#single loop, writing a row to a range
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    sh2.Range(sh2.Cells(row,1), sh2.Cells(row, len(line))).Value = line
print "Processing time: " + str(time.time() - start) + " seconds."

#no loop, write array to range
print "Writing with double loop to inidividual cells."
start = time.time()
try:
    sh3.Range(sh3.Cells(row,1), sh3.Cells(len(data_array), len(data_array[0]))).Value = data_array
    print "Processing time: " + str(time.time() - start) + " seconds."
except:
    print "Failed to write array to excel file."

excel.ScreenUpdating = True
sheet = None
book = None
excel.Quit()
excel = None

questionAnswers(3)

yourAnswerToTheQuestion