【发布时间】:2014-11-06 06:32:44
【问题描述】:
这是对这个问题的跟进
我有兴趣了解当数组类型为 object 时,使用 numpy 数组与列表列表对速度的影响。
如果有人对我正在使用的对象感兴趣:
import gmpy2 as gm
gm.mpfr('0') # <-- this is the object
【问题讨论】:
这是对这个问题的跟进
我有兴趣了解当数组类型为 object 时,使用 numpy 数组与列表列表对速度的影响。
如果有人对我正在使用的对象感兴趣:
import gmpy2 as gm
gm.mpfr('0') # <-- this is the object
【问题讨论】:
就速度而言,numpy 的最大通常好处来自能够向量化操作,这意味着您可以将围绕 Python 函数调用的 Python 循环替换为围绕某些内联 C(甚至自定义 SIMD 程序集)的 C 循环) 代码。 mpfr 对象的数组可能没有内置的矢量化操作,因此主要好处消失了。
但是,有些地方您仍然会受益:
A.T,是的,这基本上是免费的。np.vectorize 获得一些好处,其顺序与您从列表推导中获得的好处的顺序几乎相同。至于缺点……嗯,一个明显的缺点是使用 numpy 会限制您使用 CPython 或有时使用 PyPy(希望将来“有时”会变成“几乎总是”,但截至 2014 年还没有);如果您的代码在 Jython 或 IronPython 或非 NumPyPy PyPy 中运行得更快,那可能是坚持使用列表的好理由。
【讨论】:
gmpy2.mpfr 的问题,似乎“矢量化”并没有提高性能......我猜只是仅供参考
E[0,0,0] += 1 这样的东西比 E[0][0][0] += 1 容易
gm.sin 函数本身太慢了,Python 增加的开销不值得优化。 (正如答案所说,“基于软件的任意精度浮点比本机浮点慢。”)但在其他情况下可能不是这样。
E[0,:,0] += 1 而不是 for 循环......或类似的效果