为了账号安全,请及时绑定邮箱和手机立即绑定

简单的 Python Nest For 循环会耗尽内存

简单的 Python Nest For 循环会耗尽内存

胡子哥哥 2022-05-24 13:08:56
我有一个从 CSV 文件中读取的四元组列表,其元素的形式为 t =(id, e1, e2, label)。该列表应包含每个 t 元组:(someID, e2,e1, 3-label)。如果没有,我需要添加到列表中。我编写了以下代码并将我的列表缩小到只有 50 个元组。import nltkimport csv#file stringfs = "mydataset.csv"with open(fs) as infile:    rows = list(csv.reader(infile))[950:1000]    size = len(rows)    print("initial size =", size)    newSize = size    firstId = int(rows[1][0])    lastId = int(rows[size-1][0])    for i in range(size):        if i % 500 == 0:            rint("program progression = ", i*100/size, '%', sep ='')        tempRow = rows[i]        if tempRow[-1] == '1' or tempRow[-1] == '2':                for j in range(i+1, size):                # print("j = ", j)                    if tempRow[1] == rows[j][2] and tempRow[2] == rows[j][1]:                        if int(tempRow[3]) == 3-int(rows[j][3]):                            break                        else:                            print("error in row: ", i)                    else:                        if j == size -1:                            lastId +=1                            print(tempRow[-1])                            rows += rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]                            newSize +=1                            print("newSize", newSize)    print("END")当我运行它时,它会耗尽我的内存。它使用超过8GB的内存?请问这是怎么回事?我的 CSC 文件只有 7200 行 4 列。我真的不知道我还能做什么。
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

不知道,但这条线看起来很可疑:


rows += rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]

我无法猜测您在这里尝试做什么,但是这条线不太可能实现您的意图。这使每次执行的长度增加了一倍rows多,并且您的代码中似乎没有任何内容可以减少rows.


使理解要点变得非常简单:


>>> rows = [1]

>>> for i in range(20):

...     rows += rows

...     print(i, len(rows))

显示:


0 2

1 4

2 8

3 16

4 32

5 64

6 128

7 256

8 512

9 1024

10 2048

11 4096

12 8192

13 16384

14 32768

15 65536

16 131072

17 262144

18 524288

19 1048576


查看完整回答
反对 回复 2022-05-24
?
皈依舞

TA贡献1851条经验 获得超3个赞

非常感谢!你说对了。我不得不做删除+!

rows = rows +[[ str(lastId), tempRow[2], tempRow[1], str(3-int(tempRow[3])) ]]


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信