matriz de escritura para sobresalir en python con win32com

Estoy haciendo un pitón que analiza los archivos de datos. Los datos analizados se envían a un archivo de Excel. Los datos pueden ser bastante grandes. Estoy viendo de 10 a 20 columnas, pero el número de filas puede ser muy superior a 100.000.

Escribir esta cantidad de datos para sobresalir con win32com lleva una cantidad de tiempo considerable. Mi primer paso fue recorrer cada celda en el archivo de Excel, lo cual consume mucho tiempo. Después de algunas excavaciones, descubrí cómo puedo escribir una fila con una sola llamada, reduciendo drásticamente el tiempo necesario.

Sin embargo, cuando necesito enviar 100.000 filas de datos para sobresalir, todavía llevará mucho tiempo. Estoy bastante seguro de que puedo acelerar más esto, enviando la matriz completa con una sola llamada. Sin embargo no puedo lograr esto hasta ahora.

Vea el código a continuación, que demuestra el problema. El código muestra las diferencias en el tiempo. Sin embargo, el tercer paso, enviar la matriz completa con una sola llamada a un rango no resulta en la información correcta en Excel. ¿Qué estoy haciendo mal?

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta