为什么numpy的效率无法扩展

蒂姆·吉

我一直在比较numpy与Python列表推导将随机数数组相乘的相对效率。(Python 3.4 / Spyder,Windows和Ubuntu)。

正如人们所期望的那样,对于除最小数组以外的所有数组,numpy的性能迅速超过了列表理解,并且随着数组长度的增加,您可以获得预期的S形曲线。但是乙状结肠远非光滑,我对此感到困惑。

显然,对于较短的阵列长度,存在一定数量的量化噪声,但是我得到的噪声却出乎意料,尤其是在Windows下。这些数字是各种阵列长度的100次运行的平均值,因此应消除任何瞬时影响(所以我会想到)。

性能特点

Numpy and Python list performance comparison

下图显示了使用numpy与列表推导的长度不同的数组相乘的比率。

Array Length    Windows     Ubuntu
           1        0.2        0.4
           2        2.0        0.6
           5        1.0        0.5
          10        3.0        1.0
          20        0.3        0.8
          50        3.5        1.9
         100        3.5        1.9
         200       10.0        3.0
         500        4.6        6.0
       1,000       13.6        6.9
       2,000        9.2        8.2
       5,000       14.6       10.4
      10,000       12.1       11.1
      20,000       12.9       11.6
      50,000       13.4       11.4
     100,000       13.4       12.0
     200,000       12.8       12.4
     500,000       13.0       12.3
   1,000,000       13.3       12.4
   2,000,000       13.6       12.0
   5,000,000       13.6       11.9

所以我想我的问题是,谁能解释为什么结果,尤其是在Windows下如此嘈杂。我已经多次运行测试,但结果似乎总是完全相同。

更新。在Reblochon Masque的建议下,我已禁用了抓斗收集。这可以使Windows的性能稍微有些平滑,但是曲线仍然很粗糙。

更新了性能特征,没有垃圾收集

Numpy and Python list performance comparison
(Updated to remove garbage collection)

Array Length    Windows     Ubuntu
           1        0.1        0.3
           2        0.6        0.4
           5        0.3        0.4
          10        0.5        0.5
          20        0.6        0.5
          50        0.8        0.7
         100        1.6        1.1
         200        1.3        1.7
         500        3.7        3.2
       1,000        3.9        4.8
       2,000        6.5        6.6
       5,000       11.5        9.2
      10,000       10.8       10.7
      20,000       12.1       11.4
      50,000       13.3       12.4
     100,000       13.5       12.6
     200,000       12.8       12.6
     500,000       12.9       12.3
   1,000,000       13.3       12.3
   2,000,000       13.6       12.0
   5,000,000       13.6       11.8

更新

在@Sid的建议下,我将其限制为只能在每台计算机的单个内核上运行。曲线稍微更平滑(尤其是Linux曲线),但是仍然带有弯曲和一些噪音,尤其是在Windows下。

(实际上,这是我最初要发布的变形,因为它们始终出现在相同的位置。)

Numpy and Python list performance comparison
(Garbage collection disabled and running on 1 CPU)

Array Length    Windows     Ubuntu
           1        0.3        0.3
           2        0.0        0.4
           5        0.5        0.4
          10        0.6        0.5
          20        0.3        0.5
          50        0.9        0.7
         100        1.0        1.1
         200        2.8        1.7
         500        3.7        3.3
       1,000        3.3        4.7
       2,000        6.5        6.7
       5,000       11.0        9.6
      10,000       11.0       11.1
      20,000       12.7       11.8
      50,000       12.9       12.8
     100,000       14.3       13.0
     200,000       12.6       13.1
     500,000       12.6       12.6
   1,000,000       13.0       12.6
   2,000,000       13.4       12.4
   5,000,000       13.6       12.2

在此处输入图片说明

席德

垃圾收集器解释了其中的大部分内容。其余的可能会根据计算机上运行的其他程序而有所波动。如何关闭大多数功能并运行最低限度并进行测试。由于您使用的是日期时间(即经过的实际时间),因此必须同时考虑所有处理器上下文切换。

您也可以尝试使用unix调用将其固定在处理器上,同时运行它,这可能有助于进一步使其平滑。因此,在Ubuntu上可以做到:https//askubuntu.com/a/483827

对于Windows,可以这样设置处理器的关联性:http : //www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an-application-in-windows/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么MappedByteBuffer无法扩展?

为什么DTD无法扩展?

为什么numpy数组的莳萝比pickle更快,磁盘效率更高

为什么我无法使用扩展功能?

为什么无法在Java中扩展注释?

为什么len在DataFrame上比在底层numpy数组上效率高得多?

为什么numpy无法计算长对象?

为什么气泡排序效率不高?

为什么我的多线程效率不高?

为什么awk的效率表现不佳

为什么我的容器div无法扩展以显示内容?

为什么 Cursor 无法识别我的扩展特性?

为什么我的Navbar无法在Wordpress中扩展?

为什么此RPC服务器无法扩展?

为什么新的Base()无法传递给<?扩展Base>?

为什么ssh无法在.ssh / config中扩展%h变量?

为什么在MutableCollection的扩展中无法使用sort(by :)?

java扩展静态方法,无法编译,为什么?

为什么使用扩展语法的map()无法正常工作?

为什么 kotlin 无法扩展我的类型别名?

为什么VSCode“无法打开扩展。发生未知错误。”?

为什么我无法使这些扩展正常工作?

为什么我的ios 10中的uilabel无法扩展?

为什么numpy无法删除这个无用的维?

为什么这个numpy数组太大而无法加载?

为什么创建一个小数组然后扩展它而不是完全从一个大列表中创建一个数组效率更高?

为什么是,如果(变量1%变量2 == 0)效率低下?

为什么推式通知(例如GCM)电池效率更高?

为什么GRO更有效率?