所以目前我有一个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")
答案 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()
我得到以下结果:
在图上您可以看到,对于列表情况,您经常有一些峰值(可能是由于重定位),并且似乎随着列表的大小而增加。此示例带有短附加字符串,但是字符串越大,您看到的效果越多。
如果它不能解决问题,那么它可能会链接到数据库本身,但是如果不了解数据库的详细信息,我将无法为您提供帮助。