Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与numpy对象数组相比,列表列表在速度方面有哪些优点/缺点?_Python_Arrays_Numpy - Fatal编程技术网

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

Python 与numpy对象数组相比,列表列表在速度方面有哪些优点/缺点?,python,arrays,numpy,Python,Arrays,Numpy,这是这个问题的后续行动 我感兴趣的是了解当数组类型为object时,使用numpy数组与使用列表列表的速度影响 如果有人对我使用的对象感兴趣: import gmpy2 as gm gm.mpfr('0') # <-- this is the object 将gmpy2导入为gm gm.mpfr('0')#就速度而言,numpy的最大好处通常来自能够对操作进行矢量化,这意味着您可以将围绕Python函数调用的Python循环替换为围绕某些内联C(甚至自定义SIMD汇编)代码的C循环。对

这是这个问题的后续行动

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

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

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

gm.mpfr('0')#就速度而言,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或非NumpyPyPyPy中运行得更快,那么这可能是坚持使用列表的一个很好的理由。

我曾询问过关于在
gmpy2.mpfr上循环的问题,似乎“矢量化”并没有提高性能。。。仅供参考我猜为什么numpy的就地操作更容易?我想你是说smth像
E[0,0,0]+=1
E[0][0][0]+=1
@evan54:这可能取决于你想做什么。看起来
gm.sin
函数本身非常慢,Python增加的开销不值得优化。正如答案所说的,“基于软件的、任意的精确浮点比本地浮点慢。”但是在其他情况下,这可能不是真的。@ EvAN54:考虑如何在列表列表中替换(或递增,或任意)一个整列。是的,我想我明白了。在一种情况下,您将执行
E[0,:,0]+=1
而不是for循环。。。或者类似的东西