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

2024-09-30 01:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这是这个问题的后续

What are the benefits / drawbacks of a list of lists compared to a numpy array of OBJECTS with regards to MEMORY?

我有兴趣了解当数组是object类型时使用numpy数组与列表列表的速度关系。在

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

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

Tags: ofthetonumpy列表object数组what
1条回答
网友
1楼 · 发布于 2024-09-30 01:23:18

就速度而言,numpy最大的好处是能够将操作矢量化,这意味着您可以将Python函数调用周围的Python循环替换为一些内联C(甚至自定义SIMD汇编)代码的C循环。对于mpfr对象的数组,可能没有内置的矢量化操作,因此主要的好处就消失了。在

不过,有些地方你还是会受益的:

  • 一些需要纯Python复制的操作基本上是免费的,可以通过numpy转换2D数组、切片列或行、甚至重塑维度来完成,这些操作都是通过用不同的跨步信息包装指向相同底层数据的指针来完成的。因为您最初的问题是专门询问A.T,所以这基本上是免费的。在
  • 许多操作可以在numpy中比在Python中更容易地就地执行,这可以为您节省更多的副本。在
  • 即使在需要复制时,大容量复制一个大的内存数组,然后对所有对象进行refcount都要比遍历嵌套列表(将它们一直向下复制)更快。在
  • 用numpy编写自定义Cython代码将任意操作矢量化比用Python容易得多。在
  • 在普通Python函数中使用^{}仍然可以获得一些好处,其顺序与从for语句的列表理解中获得的好处基本相同。在
  • 在一定的大小范围内,如果您小心地使用适当的跨步,numpy可以让您相对容易地优化缓存位置(或者更大尺寸的VM交换),而对于列表列表,根本没有办法做到这一点。与处理可以直接嵌入到数组中的值相比,在处理指向可能分散在内存中的对象的指针数组时,这要少得多。在

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

相关问题 更多 >

    热门问题