与 numpy 对象数组相比,列表列表在速度方面有哪些优点/缺点?

2023-12-04

这是这个问题的后续

与 numpy 对象数组相比,列表列表在内存方面有哪些优点/缺点?

我有兴趣了解当数组为类型时使用 numpy 数组与列表列表的速度影响object.

如果有人对我正在使用的对象感兴趣:

import gmpy2 as gm
gm.mpfr('0') # <-- this is the object

就速度而言,numpy 最大的常见好处来自能够向量化操作,这意味着您可以将围绕 Python 函数调用的 Python 循环替换为围绕某些内联 C(甚至自定义 SIMD 汇编)代码的 C 循环。可能没有针对数组的内置向量化操作mpfr对象,从而使主要利益消失。

然而,有些地方您仍然会受益:

  • 一些在纯 Python 中需要复制的操作在 numpy 中基本上是免费的——转置 2D 数组、切片列或行,甚至重塑维度都是通过使用不同的跨步信息包装指向相同基础数据的指针来完成的。由于您最初的问题专门询问了A.T,是的,这基本上是免费的。
  • 许多操作在 numpy 中比在 Python 中更容易就地执行,这可以为您节省更多副本。
  • 即使需要复制,批量复制一个大内存数组,然后对所有对象进行重新计数,也比迭代嵌套列表并一直向下深度复制它们要快。
  • 与使用 Python 相比,使用 numpy 编写自己的自定义 Cython 代码来矢量化任意操作要容易得多。
  • 您仍然可以从使用中获得一些好处np.vectorize围绕一个普通的 Python 函数,几乎与从列表理解相对于 for 语句获得的好处相同。
  • 在某些大小范围内,如果您小心地使用适当的跨步,numpy 可以让您相对轻松地优化缓存局部性(或较大大小的虚拟机交换),而对于列表列表实际上根本没有办法做到这一点。当您处理指向可能分散在内存中的对象的指针数组时,这比处理可以直接嵌入数组中的值时要少得多,但它仍然是一些东西。

至于缺点……嗯,一个明显的缺点是使用 numpy 会限制你使用 CPython 或者有时使用 PyPy(希望将来“有时”会变成“几乎总是”,但截至 2014 年还没有完全实现);如果您的代码在 Jython 或 IronPython 或非 NumPyPy PyPy 中运行得更快,这可能是坚持使用列表的一个很好的理由。

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

与 numpy 对象数组相比,列表列表在速度方面有哪些优点/缺点? 的相关文章

随机推荐