【问题标题】:What are the benefits / drawbacks of a list of lists compared to a numpy array of OBJECTS with regards to SPEED?与 numpy 的 OBJECTS 数组相比,列表列表在 SPEED 方面的优点/缺点是什么?
【发布时间】:2014-11-06 06:32:44
【问题描述】:

这是对这个问题的跟进

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

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

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

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

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

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

    【讨论】:

    • stackoverflow.com/questions/26600471/… 我曾问过关于循环 gmpy2.mpfr 的问题,似乎“矢量化”并没有提高性能......我猜只是仅供参考
    • 为什么在numpy中就地操作更容易?我假设你的意思是像 E[0,0,0] += 1 这样的东西比 E[0][0][0] += 1 容易
    • @evan54:这可能取决于你想要做什么。看起来gm.sin 函数本身太慢了,Python 增加的开销不值得优化。 (正如答案所说,“基于软件的任意精度浮点比本机浮点慢。”)但在其他情况下可能不是这样。
    • @evan54:考虑一下如何在列表列表中就地替换(或增加,或其他)一整列。
    • 是的,我想我明白了。在一种情况下,您会使用 E[0,:,0] += 1 而不是 for 循环......或类似的效果
    猜你喜欢
    • 2015-01-02
    • 2011-03-29
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2019-09-07
    • 2014-10-16
    • 2016-02-27
    相关资源
    最近更新 更多