python字符连接效率问题

ahui5252 2013-04-02 06:54:32
win32com.client打开excel,excel保存的是数据库table数据,用的是下面的字符连接方式,也试过先append成列表再join方法,直接+=方法,‘%s,%s’%(xx,xx)方法,发现效率都不高,十几个字段的表1500多记录要5分钟左右,有一个用perl写的版本处理同样的只需要30秒左右,perl用的连接字符方式是.=.本人最近工作没那么忙,在弄下python,想弄个python版本的导数据库小工具(已有perl版,但本人不懂perl),但发现字符连接耗时太多,导至整个过程长达1个多钟,没法忍受。求教下大家有没提高的方法。或者改进这段代码。感觉写的比较乱。最近才学python的
row = sh.UsedRange.Rows.Count
col = sh.UsedRange.Columns.Count
for r in range(2, row + 1):
sql_s = StringIO()
sql_s.write(sql_str)
cant_do = 0
for c in range(1, col + 1):
var = sh.Cells(r, c).Value
if (var == None):
if (c == 1):
cant_do = 1
break
elif (c <= real_col):
sql_s.write(',\'\'')
else:
if (isinstance(var, unicode)):
var = var.encode('gb18030')
if (c == 1):
sql_s.write('\'%s\'' % var)
else:
sql_s.write(',\'%s\'' % var)
...全文
184 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-04-03
  • 打赏
  • 举报
回复
有点好奇的是,不晓得为啥要把那么多数据拼接连接起来?全部一串,貌似也不好再干其他事,不如直接写进文件?
ImN1 2013-04-03
  • 打赏
  • 举报
回复
引用 7 楼 ahui5252 的回复:
引用 2 楼 snmr_com 的回复:1个多小时应该不仅是字符串连接的问题,你用cProfile检查一下那个模块是瓶颈 呵呵,才知道有cProfile这东东。不过不太会看哎。截图是这样。
这个只有你自己才知道,模块名给我看也不知道 大致第一列是调用次数,后面几列的时间只差不多,较大的就是瓶颈 要结合实际,例如我有个程序hash部分用时最多,IO其次,但hash模块没法优化,只能从IO着手
ahui5252 2013-04-03
  • 打赏
  • 举报
回复
引用 4 楼 angel_su 的回复:
有点好奇的是,不晓得为啥要把那么多数据拼接连接起来?全部一串,貌似也不好再干其他事,不如直接写进文件?
excel表保存的是数据库一个表的数据,每列都是不同字段,做表更新时要把每一列串起来组成一条sql语句。
ahui5252 2013-04-03
  • 打赏
  • 举报
回复
引用 2 楼 snmr_com 的回复:
1个多小时应该不仅是字符串连接的问题,你用cProfile检查一下那个模块是瓶颈


呵呵,才知道有cProfile这东东。不过不太会看哎。截图是这样。
angel_su 2013-04-03
  • 打赏
  • 举报
回复
个人理解普通读写是用户层面的吧,往内存堆积等同拼接不是直接送往磁盘,不强制flush要等缓存满了才交给系统...
ahui5252 2013-04-03
  • 打赏
  • 举报
回复
改用xlrd了。好快,之前5分钟的几要几秒了。结贴
ahui5252 2013-04-03
  • 打赏
  • 举报
回复
发现是这句太费时var = sh.Cells(r, c).Value,占了260多秒。win32com.client读取的是xls文件
ImN1 2013-04-03
  • 打赏
  • 举报
回复
引用 4 楼 angel_su 的回复:
有点好奇的是,不晓得为啥要把那么多数据拼接连接起来?全部一串,貌似也不好再干其他事,不如直接写进文件?
有些时候还是要拼接的,例如socket一次接收才几k,总不能老是拿硬盘开刷吧,拼接到一定长度才写入文件
libralibra 2013-04-02
  • 打赏
  • 举报
回复
不是说python的字符串是immutable对象吗? 用字符串列表试试,就是'abc'弄成['a','b','c']这种 不过,详细的测试看着一页: http://www.skymind.com/~ocrow/python_string/ Method 1: Naive appending Method 2: MutableString class Method 3: Character arrrays Method 4: Build a list of strings, then join it Method 5: Write to a pseudo file Method 6: List comprehensions 结论是: Results: Twenty thousand integers Concatenations(/s) Process size(kB) Method 1 3770 2424 Method 2 2230 2424 Method 3 29,600 2452 Method 4 83,700 3028 Method 5 90,900 2536 Method 6 119,800 3000 Results: Five hundred thousand integers Concatenations(/s) Process size(kB) Method 3 17,100 8,016 Method 4 74,800 22,872 Method 5 94,900 10,480 Method 6 102,100 22,844
ImN1 2013-04-02
  • 打赏
  • 举报
回复
1个多小时应该不仅是字符串连接的问题,你用cProfile检查一下那个模块是瓶颈
ImN1 2013-04-02
  • 打赏
  • 举报
回复
+的效率确实很低 如果是顺序连接,最佳方法是建一个StringIO,逐个写入最后getvalue()读出 非顺序连接(有可能前插入),就用format()或''.join(字串列表)

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧