gpt4 book ai didi

Python Numpy : np. int32 "slower"比 np.float64

转载 作者:太空狗 更新时间:2023-10-29 18:28:02 24 4
gpt4 key购买 nike

我想了解 python 的一个奇怪行为。让我们考虑一个矩阵 M,其形状为 6000 x 2000。该矩阵填充有符号整数。我想计算 np.transpose(M)*M。两种选择:

  • 当我“自然地”执行此操作时(即没有指定任何类型),numpy 选择类型 np.int32 并且该操作大约需要 150 秒。
  • 当我强制类型为 np.float64(使用 dtype=...)时,相同的操作大约需要 2 秒。

我们如何解释这种行为?我天真地认为 int 乘法比 float 乘法便宜。

非常感谢您的帮助。

最佳答案

不,整数乘法并不便宜。但稍后会详细介绍。很可能(我有 99% 的把握)numpy 调用 BLAS 例程,其效率可达 90% 的峰值 CPU 性能。 int 矩阵乘法没有特殊规定,很可能是用 Python 而不是机器编译版本完成的 - 我实际上错了,见下文。

关于 intfloat 速度:在大多数架构(Intel)上,它们大致相同,每条指令大约 3-5 个周期,都具有串行(X87) 和矢量 (XMM) 版本。在 Sandy 桥上,PMUL***(整数向量乘法)是 5 个周期,MULP*(浮点乘法)也是如此。使用 Sandy Bridge,您还拥有 256 位 SIMD 向量运算 (YMM) - 每条指令可获得 8 个 float 运算 - 我不确定是否有 int 对应项。

这是一个很好的引用:http://www.agner.org/optimize/instruction_tables.pdf

也就是说,指令延迟并不能解释 75 倍的速度差异。它可能是优化的 BLAS(可能是线程化的)和 int32 在 Python 而不是 C/Fortran 中处理的组合。

我分析了以下片段:

>>> F = (np.random.random((6000,2000))+4)
>>> I = F.astype(np.int32)
>>> np.dot(F, F.transpose()); np.dot(I, I.transpose())

这是 oprofile 所说的:

CPU_CLK_UNHALT...|
samples| %|
------------------
2076880 51.5705 multiarray.so
1928787 47.8933 libblas.so.3.0

但是 libblas 是未优化的串行 Netlib Blas。通过良好的 BLAS 实现,47% 会低得多,特别是如果它是线程化的。

编辑:似乎 numpy 确实提供了整数矩阵乘法的编译版本。

关于Python Numpy : np. int32 "slower"比 np.float64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com