Python 中的迭代器节省内存吗?

2023-11-21

我不太明白Python中迭代器是如何拥有内存的。

>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [2, 3, 4, 5, 6, 7]
>>> iz = izip(l1, l2)

我们仍然需要O(min(l1, l2))内存,因为我们需要加载列表l1 and l2在记忆中。

我认为迭代器的主要用途之一是节省内存 - 但它在这里似乎没有用。

同样,下面的代码我也不清楚:

>>> l1 = ( n for n in [1, 2, 3, 4, 5, 6] )
>>> l2 = ( n for n in [2, 3, 4, 5, 6, 7] )
>>> iz = izip(l1, l2)

我们需要在将列表转换为生成器之前加载列表,对吧?这意味着我们会浪费内存。那么 - 生成器在这里还有什么意义呢?

这是唯一对我有意义的情况:

def build_l1():
    for n in xrange(1, 6):
       yield n

def build_l2:
    for n in xrange(2, 7):
       yield n

l1 = build_l1()
l2 = build_l2()
iz = izip(l1, l2)

没有任何数组被加载到内存中。因此我们在O(1) memory.

Python 中迭代器函数的内存使用情况如何?前两种情况似乎使用O(min(l1, l2))记忆。我认为迭代器的主要目的是节省内存,这使得前两种情况显得毫无用处。


你的例子太简单了。考虑一下:

nums = [1, 2, 3, 4, 5, 6]
nums_it = (n for n in nums)

nums_it是一个生成器,返回所有未修改的项目nums。显然你没有任何优势。但请考虑一下:

squares_it = (n ** 2 for n in nums)

并将其与:

squares_lst = [n ** 2 for n in nums]

With squares_it,我们正在生成的平方nums仅在需要时才进行飞行。和squares_lst,我们一次生成所有这些并将它们存储在一个新列表中。

所以,当你这样做时:

for n in squares_it:
    print(n)

就像你在做的那样:

for n in nums:
    print(n ** 2)

但是当你这样做时:

for n in squares_lst:
    print(n)

就像你在做的那样:

squares_lst = []
for n in nums:
    squares_lst.append(n ** 2)
for n in squares_lst:
    print(n)

如果您不需要(或没有)该列表nums,那么您可以使用以下方法节省更多空间:

squares_it = (n ** 2 for n in xrange(1, 7))

生成器和迭代器还提供了另一个显着的优点(根据具体情况,这实际上可能是一个缺点):它们的计算是惰性的。

此外,生成器和迭代器可以产生无限数量的元素。一个例子是itertools.count()产生 0, 1, 2, 3, ...,永无止境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的迭代器节省内存吗? 的相关文章

随机推荐

  • 如何重用matplotlib.Axes.hist的返回值?

    假设我想绘制两次相同数据的直方图 import matplotlib pyplot as plt fig plt figure figsize 8 6 ax1 ax2 fig subplots nrows 2 ncols 1 ax1 his
  • Flutter:如何将拇指图像添加到滑块?

    我尝试将图像添加到滑块拇指 但我不知道它应该如何工作 在SliderThemeData我们没有用于添加缩略图的参数 我已经绑定使用SliderComponentShape用于绘制拇指 但它不起作用 class TimeReportTextF
  • Django - makemigrations - 未检测到任何更改

    我试图使用 makemigrations 命令在现有应用程序中创建迁移 但它输出 未检测到更改 通常我使用以下方式创建新应用程序startapp命令 但在我创建该应用程序时并未将其用于此应用程序 经过调试 我发现它没有创建迁移 因为migr
  • 名称为“mainController”的控制器未注册

    我的 script js 文件中有这段代码 var mainController function scope scope message Plunker 这是我的 HTML
  • 如何在cmake中添加库路径?

    我的项目中有 2 个文件夹 inc 和 lib 分别具有标头和静态库 我如何告诉 cmake 分别使用这两个目录进行包含和链接 最简单的方法是添加 include directories CMAKE SOURCE DIR inc link
  • Cassandra 提交日志澄清

    我已经阅读了有关 Cassandra 提交日志的多个文档 对我来说 有关此 结构 的信息存在冲突 该图显示 当发生写入时 Cassandra 会写入内存表和提交日志 令人困惑的部分是该提交日志所在的位置 我反复看到的图表显示了磁盘上的提交日
  • 需要 git rebase -Ignore-all-space 来保留我的空间

    我正在做一个重大更改的变基 其中有很多空白更改 为了使合并能够正常工作 我需要 Xignore all space 根据 git help rebase 忽略空间更改 忽略所有空间 忽略 eol 处的空间 为了三向合并 将具有指定类型的空白
  • Java 将 int 转换为 hex 并再次转换回来

    我有以下代码 int Val 32768 String Hex Integer toHexString Val 这相当于ffff8000 int FirstAttempt Integer parseInt Hex 16 Error Inva
  • 获取堆栈中上一层函数的 __file__

    我发现我经常使用这种模式 os path join os path dirname file file path 所以我决定在一个包含许多这样的小实用程序的文件中放入一个函数 def filepath in cwd file path re
  • 防止列表视图丢失所选项目

    我目前正在 winform c 中的列表视图上工作 每次我点击列表视图上的空白区域时 所选项目丢失 列表视图控件有一个HideSelection默认为的属性True 做了False就可以开始了 在某些情况下这就足够了
  • 将class文件转换为dex文件

    android中如何将class文件转换为dex文件 有什么办法吗 使用 dex 选项调用 dx 命令 如下所示 dx dex output
  • 将新的 subversion 远程添加到现有的 Git 存储库中

    我有一个完全跟踪远程 SVN 存储库的 git 存储库 现在我需要添加一个新分支 该分支将跟踪完全不同的 SVN 存储库中的目录 那可能吗 It is git svn init只编辑默认的 svn 远程 你必须编辑配置文件 Look in
  • 如何在android中保存(切换)按钮状态?

    我在我的 andorid 应用程序中使用 SWITCH 如 android 切换按钮 而不是普通按钮 该代码在启用和禁用开关时工作正常 但我想存储开关的状态 假设我启用开关并关闭我的应用程序 后台代码将正常运行 但开关状态将更改为禁用 每次
  • iOS 开发:如何缩短代码中的 URL?

    我正在构建一个 iPhone 应用程序 我希望包含允许用户登录 Twitter 并在 Twitter 上发布指向我的应用程序的链接的功能 然而 为了做到这一点 该推文需要缩短我在 App Store 上的应用程序的 URL 如何编写代码来缩
  • 跟踪目录产品展示次数 - 增强型电子商务 Google Analytics

    我正在尝试使用以下方法在电子商务目录页面上实现产品印象谷歌分析增强电子商务追踪 按照规范 应该像这样实现它 ga create UA XXXXX Y ga require ec ga ec addImpression id P12345 P
  • 通过 SOCKS5 代理连接到 .NET Web 服务

    我正在尝试通过 SOCKS5 代理连接到 Web 服务 目前 我的app config如下
  • 如何在 Firefox 中让

    在这里 这个问题已经针对 IE 和 Chrome 得到了解答 但所提出的解决方案似乎不适用于 Firefox 16 45 以及可能之间的所有版本 基本上 建议的解决方案如下 table th td border 1px solid blac
  • 使用用户脚本捕获页面 xmlhttp 请求

    我有一个用户脚本 适用于 chrome 和 FF 它向页面添加了重要的功能 但最近被破坏了 因为开发人员向页面添加了一些 AJAX 我想修改脚本来监听页面 xmlhttp 请求 以便我可以根据 JSON 格式动态更新我添加的内容respon
  • 3D CSS 变换,Firefox 中的锯齿状边缘

    如同 css 变换 chrome 中的锯齿状边缘 同样的情况也发生在 Firefox 的 3D 变换上 例如 http jsfiddle net 78d8K 5 Firefox 这次 backface visibility没有帮助 任何想法
  • Python 中的迭代器节省内存吗?

    我不太明白Python中迭代器是如何拥有内存的 gt gt gt l1 1 2 3 4 5 6 gt gt gt l2 2 3 4 5 6 7 gt gt gt iz izip l1 l2 我们仍然需要O min l1 l2 内存 因为我们