python关于列表生成式的内存占用问题
今天爬虫遇到个很奇怪的问题,整个测试大致是这样的:
python">采用scrapy shell测试:scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" "https://book.douban.com/tag/"
# 代码一
from pyquery import PyQuery as pq
doc = pq(response.text)
aa = []
bb = []
for i in na:
for item in doc(f'a[name="{i}"][class="tag-title-wrapper"]').items():
# 测试一的写法,直接用aa得到生成式的结果,结果有缺失
aa = [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]
#测试二的写法,用一个外面的列表得到结果,bb能得到想要的结果,但也存在疑问
[bb.append(x.attr("href")) for x in item.siblings(".tagCol").find('a'.items())]
当爬取数据条目时,测试一的结果压根不是想要的结果,但是测试二的结果却是准确的结果。但同时测试二的结果在内存上让我不禁有些疑问:这样产生的结果虽然让bb接收到了,但是整个列表生成式本身也会产生一个结果,而致占用较大内存。因此我用了一个较简单的方法进行测试,如下:
# 代码二:>>>a,b = [1,2,3],[4,5,6]
>>>x,y = [],[]
>>>x1 = [x.append(j) for i in zip(a,b) for j in i]
>>>x1
[None, None, None, None, None, None]
>>>x
[1, 4, 2, 5, 3, 6] # 是想要的结果
>>>y = [j for i in zip(a,b) for j in i]
>>>y
[1, 4, 2, 5, 3, 6] # 是想要的结果
分析和问题:
产生差别的原因,个人认为是因为append()方法没有返回值,所以遍历时每次都为None。但不理解的是:列表生成式生成的列表是否会占用内存?有什么更简单的方法(不通过append()方法)拿到列表生成式的结果吗?
希望问题已经表述清楚,谢谢大佬们的解惑!
回答:
aa = [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]
你每次循环都把aa重新赋值 结果肯定缺失啊aa = aa + [x.attr("href") for x in item.siblings(".tagCol").find("a").items()]
以上是 python关于列表生成式的内存占用问题 的全部内容, 来源链接: utcz.com/p/937783.html