[D]python 怎样加快for循环速度

万籁俱寂寂 2012-03-13 05:19:56
现在要从数据库读取海量的数据,每次读10000行,逐行逐字段遍历,输出给客户,目前遍历的速度比较慢,请问有什么办法,可以使这个for循环速度加快?
以下是代码:

db.getCursor()
while 1:
rows = db.getData(10000)
line = 0
for row in rows:
rowex = ''
for item in row:
if item == None:
item = ''
elif isinstance(item, datetime.datetime):
item = "{:%Y%m%d%H%M%S}".format(item)
else:
str(item).replace('\\','\\\\')
rowex = rowex + "\t{0}".format(item)
rowex += "\n"
self.write(rowex[1:])
self.flush()
line += 1
if not (line % 10000):
print (line)
if line < 10000:
break
self.flush()
db.finish()

----------------------------
Double活动:
原帖分数:20
加分:20
...全文
3296 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
深山老宅 2012-03-14
  • 打赏
  • 举报
回复
是要刻意修改代码的速度(即不考虑IO的限制)?
多次调用那个flush肯定慢
socrates 2012-03-13
  • 打赏
  • 举报
回复
可以参考我的这篇文章《Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法》

简单的说,将for循环部分用C实现,然后python调用,这样效率提高很多。
panghuhu250 2012-03-13
  • 打赏
  • 举报
回复
1. 有可能是db操作慢,把下面的循环中的代码换掉,看看只是从db中读出数据的速度,即把

          
for row in rows:
rowex = ''
for item in row:
if item == None:
item = ''
elif isinstance(item, datetime.datetime):
item = "{:%Y%m%d%H%M%S}".format(item)
else:
str(item).replace('\\','\\\\')
rowex = rowex + "\t{0}".format(item)


改成:

for row in rows:
rowex=''


2. 一个可能的bug:下面一行代码并不会改变item本身的值,只是产生了一个新字符串,然后把它丢掉了。
str(item).replace('\\','\\\\')


例如:

>>> s = "abcd"
>>> str(s).replace('a', 'e')
0: 'ebcd'
>>> s
1: 'abcd'
>>>
Rlay_2 2012-03-13
  • 打赏
  • 举报
回复
用缓存的吧, 我只记得xrange是缓存的,不会一次读入10000条数据, 这样可能会快点
fibbery 2012-03-13
  • 打赏
  • 举报
回复
如果你是输出到标准输出,我建议你存到文件里。
angel_su 2012-03-13
  • 打赏
  • 举报
回复
想到一个:避免合并字串,直接写入文件...

37,719

社区成员

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

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