编辑:修复了基准代码中的错误。
你可以把东西缩短一点,让它们更像Python:for i, l in enumerate(listdata):
for j, col in enumerate(l):
sheet.write(i, j, col)
但据我所知,没有像使用csv.reader那样容易编写的方法。
注意:在您提供的代码中,您从不递增row或col,因此您在嵌套for循环的每次迭代中都会覆盖(0,0)处的单元格。小心点!使用enumerate可以解决这个问题。
基准
结果是,join将每一行与一个逗号放在一起并编写它大约比使用枚举一次快3倍。
下面是一些测试代码:import xlwt
import timeit
def wrapper(fn, *args, **kwargs):
def wrapped():
return fn(*args, **kwargs)
return wrapped
def excel_writer():
xldoc = xlwt.Workbook()
sheet1 = xldoc.add_sheet("Sheet1", cell_overwrite_ok=True)
rows = [[str(y) for y in xrange(100)] for x in xrange(10000)]
fn1 = wrapper(cell_writer, rows, sheet1)
fn2 = wrapper(row_writer, rows, sheet1)
print timeit.timeit(fn1, number=10)/10
print timeit.timeit(fn2, number=10)/10
xldoc.save('myexcel.xls')
def cell_writer(rows, sheet):
for i, row in enumerate(rows):
for j, col in enumerate(row):
sheet.write(i, j, col)
def row_writer(rows, sheet):
rows = [', '.join(row) for row in rows]
for i, strrow in enumerate(rows):
sheet.write(i, 0, strrow)
if __name__ == '__main__':
excel_writer()
用number = 1(当然除以1):cell_writer: 15.2915050441
row_writer: 0.205128928987
使用number = 10:cell_writer: 17.3386430596
row_writer: 0.204951626882
我把这一巨大的时间差异归因于join比编写excel更快的速度。当然,速度方面的最大瓶颈是excel的编写。
但是,请注意,在excel中拆分单元格所需的时间可能会超过使用row_writer方法节省的时间。这也可能给最终用户带来不便;请进行判断!