由于大量列表,Python For循环变慢

时间:2019-06-22 21:56:23

标签: python-3.x list for-loop psycopg2

所以目前我有一个for循环,这导致python程序死于程序“ Killed”。它减慢了大约6000个项目的速度,该程序在大约6852个列表项中缓慢消失。我该如何解决?

我认为是由于列表太大。

我曾尝试将列表分成6000个左右的两个部分。也许是由于内存管理等原因。帮助将不胜感激。

    for id in listofids:
        connection = psycopg2.connect(user = "username", password = "password", host = "localhost", port = "5432", database = "darkwebscraper")

        cursor = connection.cursor()
        cursor.execute("select darkweb.site_id, darkweb.site_title, darkweb.sitetext from darkweb where darkweb.online='true' AND darkweb.site_id = %s", ([id]))
        print(len(listoftexts))

        try:
            row = cursor.fetchone()
        except:
            print("failed to fetch one")
        try:
            listoftexts.append(row[2])
            cursor.close()
            connection.close()
        except:
            print("failed to print")

1 个答案:

答案 0 :(得分:1)

是的,这可能是因为列表变大了:python列表是内存中的连续空间。每次添加到列表后,python都会检查下一个位置是否有斑点,如果没有,他会将整个数组重新放置在有足够空间的地方。数组越大,python的重定位位置就越多。

一种解决方法是预先创建合适大小的数组。

编辑:为确保清楚,我举了一个例子来说明我的观点。我做了2个功能。第一个在每次迭代时将字符串化索引(以使其更大)追加到列表中,另一个仅填充一个numpy数组:

import numpy as np
import matplotlib.pyplot as plt
from time import time

def test_bigList(N):
    L = []
    times = np.zeros(N,dtype=np.float32)

    for i in range(N):
        t0 = time()
        L.append(str(i))
        times[i] = time()-t0

    return times

def test_bigList_numpy(N):
    L = np.empty(N,dtype="<U32")
    times = np.zeros(N,dtype=np.float32)

    for i in range(N):
        t0 = time()
        L[i] = str(i)
        times[i] = time()-t0
    return times

N = int(1e7)
res1 = test_bigList(N)
res2 = test_bigList_numpy(N)

plt.plot(res1,label="list")
plt.plot(res2,label="numpy array")
plt.xlabel("Iteration")
plt.ylabel("Running time")
plt.legend()
plt.title("Evolution of iteration time with the size of an array")
plt.show()

我得到以下结果:

enter image description here

在图上您可以看到,对于列表情况,您经常有一些峰值(可能是由于重定位),并且似乎随着列表的大小而增加。此示例带有短附加字符串,但是字符串越大,您看到的效果越多。

如果它不能解决问题,那么它可能会链接到数据库本身,但是如果不了解数据库的详细信息,我将无法为您提供帮助。