Skip to main content
 首页 » 编程设计

python之为什么 zip 在 Python 2 中使用大量内存

2025年05月04日8itcoder

我有一个脚本,它采用 x、y 和 z 坐标,创建一个网格并对坐标进行插值。然后它会查看这些点是否在某个多边形中。运行脚本时出现内存错误。为了找到我安装的内存使用问题 memory_profiler得到如下图所示的结果:

61                                         # define grid. 
62  156.887 MiB    0.000 MiB               xi = np.arange(roundDown(XZ[~np.isnan(XZ)].min(),5), roundUp(XZ[~np.isnan(XZ)].max(), 5)+5, 5).astype(np.int32) 
63  156.887 MiB    0.000 MiB               yi = np.arange(roundDown(YZ[~np.isnan(YZ)].min(),5), roundUp(YZ[~np.isnan(YZ)].max(), 5)+5, 5).astype(np.int32) 
64  325.457 MiB  168.570 MiB               gxi, gyi = np.meshgrid(xi, yi) 
65  493.922 MiB  168.465 MiB               zi = griddata((XZ[~np.isnan(XZ)].ravel(), YZ[~np.isnan(YZ)].ravel()), dep[~np.isnan(dep)].ravel(), (gxi, gyi), method='linear') 
66 
67                             ##            sel = ~np.isnan(zi.ravel()) 
68 
69                             ##            xList = gxi.ravel()[~np.isnan(zi.ravel())] 
70                             ##            yList = gyi.ravel()[~np.isnan(zi.ravel())] 
71  563.383 MiB   69.461 MiB               zList = zi.ravel()[~np.isnan(zi.ravel())] 
72 
73                             ##            points = zip(xList, yList) 
74 1239.020 MiB  675.637 MiB               points = zip(gxi.ravel()[~np.isnan(zi.ravel())], gyi.ravel()[~np.isnan(zi.ravel())]) 

我明白了,鉴于有很多点,gxi , gyi和 zi使用相当多的内存,但为什么 zip()函数也占用大量内存?

我尝试使用 itertools.izip() , 但由于这些点需要进入另一个函数 ( matplotlib.path.Path.contains_points ),它似乎需要一个元组列表而不是一个不起作用的生成器。

有没有人有解决问题的建议?

请您参考如下方法:

[2019 年 9 月 19 日更新] 正如 John Szakmeister 所指出的: - 在 python2 中,zip() 创建新的底层列表,这会占用大量内存。所以为了减少内存使用,使用 itertools.izip(),它会返回一个合适的迭代器。

[错误的大小写 - 仅在 python3 中正确] 如 this blog post 中所述, zip() 函数不会创建底层列表,它只是创建一个迭代器对象来帮助您遍历输入可迭代对象。