遍历大列表时Python速度很慢


问题内容

我目前正在使用pyodbc从数据库中选择大量行。然后将结果复制到一个大列表中,然后我尝试遍历该列表。在放弃python并尝试在C#中创建它之前,我想知道是否做错了什么。

clientItems.execute("Select ids from largetable where year =?", year);
allIDRows = clientItemsCursor.fetchall() #takes maybe 8 seconds.

for clientItemrow in allIDRows:
    aID = str(clientItemRow[0])
    # Do something with str -- Removed because I was trying to determine what was slow
    count = count+1

更多信息:

  • for循环当前以每秒约5个循环的速度运行,这对我来说似乎太慢了。
  • 所选的总行数约为489,000。
  • 运行该计算机的计算机具有大量RAM和CPU。它似乎只能运行一两个内核,而ram是1.72GB的4GB。

谁能告诉我怎么了?脚本运行这么慢吗?

谢谢


问题答案:

对于Python本机列表,这应该不会很慢-但是,也许ODBC的驱动程序正在返回一个“惰性”对象,该对象试图变得很聪明,但变得很慢。尝试做

allIDRows = list(clientItemsCursor.fetchall())

在您的代码中并发布进一步的基准测试。

(如果您开始在中间插入内容,Python列表可能会变慢,但是仅在大列表上进行迭代应该很快)