迭代大型列表时Python很慢

nyc*_*nik 10 python sql database pyodbc

我目前正在使用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
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • for循环当前以每秒约5个循环运行,这对我来说似乎非常慢.
  • 选择的总行数为~489,000.
  • 它运行的机器有很多RAM和CPU.它似乎只运行一个或两个核心,而ram是1.72GB的4GB.

谁能告诉我什么是错的?脚本运行这么慢吗?

谢谢

jsb*_*eno 18

使用Python本机列表时,这应该不会很慢 - 但是ODBC的驱动程序可能会返回一个"懒惰"的对象,它试图变得聪明但只是变慢.试着做

allIDRows = list(clientItemsCursor.fetchall())

在您的代码中并发布更多基准测试.

(如果你开始在中间插入东西,Python列表可能会变慢,但只是在大型列表上迭代应该很快)

  • 找到pyodbc项目的网页并将其作为错误输入将是一件好事.如果fetchall没有返回列表,那么它应该比列表更有效,而不是显示停止 (5认同)