为什么numpy的效率不是s

2024-03-29 08:49:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在比较numpy和Python列表理解在将随机数数组相乘时的相对效率。(python3.4/Spyder、Windows和Ubuntu)。在

正如人们所预期的,除了最小的数组之外,numpy的性能很快超过了列表理解,并且随着数组长度的增加,性能得到了预期的sigmoid曲线。但是乙状结肠远不是光滑的,我很难理解。在

显然,对于较短的数组长度,有一定数量的量化噪声,但我得到了意外的噪声结果,尤其是在窗口下。这些数字是不同数组长度的100次运行的平均值,所以应该会平滑掉所有的瞬态效应(所以我想)。在

Performance characteristic

Numpy and Python list performance comparison

下图显示了使用numpy将不同长度的数组与列表理解相乘的比率。在

^{pr2}$

所以我想我的问题是,有人能解释为什么结果,尤其是在窗户下,噪音这么大。我做了多次测试,但结果总是一模一样的。在

更新。在莱布隆·马斯克的建议下,我已经禁用了抓取收集。这使窗户的性能有点平滑,但曲线仍然是凹凸不平的。在

Updated performance characteristic without garbage collection

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

enter image description here


Tags: andnumpy列表ubuntuwindowsperformance数组性能
2条回答

垃圾收集器解释了其中的大部分。其余的可能是基于您机器上运行的其他程序的波动。 把大多数东西关掉,运行最低限度的测试,怎么样。由于您使用的是datetime(实际经过的时间),因此它还必须考虑到任何处理器上下文切换。在

您还可以尝试在使用unix调用将其附加到处理器的同时运行它,这可能有助于进一步简化它。在Ubuntu上可以这样做:https://askubuntu.com/a/483827

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

从我的评论来看:

通常垃圾收集解释了bnchmark性能测试中的噪音;可以禁用它来运行测试,在某些情况下,会使结果更平滑。在

下面是一个链接,说明如何禁用GC:Why disable the garbage collector?

在GC之外,运行基准测试总是很棘手的,因为在系统上运行的其他进程可能会影响性能(网络连接、系统备份等)。。。这可能是自动的,在后台静默运行);也许你可以重新尝试一个新的系统引导,并尽可能少的其他进程,看看如何进行?在

相关问题 更多 >