numpy的性能是否因操作系统而异?

god*_*ygo 11 python memory performance numpy

阅读有趣的书"从Python到Numpy"我遇到了一个例子,其描述如下:

让我们考虑一个简单的例子,我们想要从具有dtype的数组中清除所有值np.float32.如何写它以最大化速度?

提供的结果让我感到惊讶,当我重新检查它们时,我得到了完全不同的行为.因此,我要求作者仔细检查,但他在下表中收到了与之前相同的结果(OS X 10):

这些变体在三台不同的计算机上定时:我的(Win10,Win7)和作者(OSX 10.13.3).使用Python 3.6.4numpy 1.14.2,其中每个变体定时为固定的100循环,最好是3.

编辑:这个问题不是关于这样一个事实:在不同的计算机上,具有不同的特征,我得到不同的时间 - 这是显而易见的:) 问题是两个操作系统上的行为是非常不同的 - 这不是那么明显?(如果是这样的话,如果有人可以仔细检查,我会很高兴).

设置是: Z = np.ones(4*1000000, np.float32)

| Variant                     | Windows 10 | Ubuntu 17.10 | Windows 7 | OSX 10.13.3 |
|                             |       computer 1          |   comp 2  |    comp 3   |
| --------------------------- | ------------------------- | --------- | ----------- |
| Z.view(np.float64)[...] = 0 | 758 usec   | 1.03 msec    | 2.72 msec | 1.01 msec   |
| Z.view(np.float32)[...] = 0 | 757 usec   | 1.01 msec    | 2.61 msec | 1.58 msec   |
| Z.view(np.float16)[...] = 0 | 760 usec   | 1.01 msec    | 2.62 msec | 2.85 msec   |
| Z.view(np.complex)[...] = 0 | 1.06 msec  | 1.02 msec    | 3.26 msec | 918 usec    |
| Z.view(np.int64)[...] = 0   | 758 usec   | 1.03 msec    | 2.69 msec | 1 msec      |
| Z.view(np.int32)[...] = 0   | 757 usec   | 1.01 msec    | 2.62 msec | 1.46 msec   |
| Z.view(np.int16)[...] = 0   | 760 usec   | 1.01 msec    | 2.63 msec | 2.87 msec   |
| Z.view(np.int8)[...] = 0    | 758 usec   | 773 usec     | 2.68 msec | 614 usec    |
| Z.fill(0)                   | 747 usec   | 998 usec     | 2.55 msec | N/A         |
| Z[...] = 0                  | 750 usec   | 1 msec       | 2.59 msec | N/A         |
Run Code Online (Sandbox Code Playgroud)

从此表中可以看出,在Windows上,结果不依赖于查看的类型,但在OS X上,此黑客会严重影响性能.您能否提供有关这种情况的见解?

编辑:正如我上面写的三台计算机不同.

第一台电脑的规格:Windows 10和Ubuntu 17.10
CPU:Intel Xenon E5-1650v4 3.60GHz
RAM:128GB DDR4-2400

第二台电脑的规格:Windows 7
CPU:Intel Pentium P6100 2.00GHz
RAM:4GB DDR3-1333

第三台电脑的规格:我没有这个信息:)

链接到该问题

编辑2:在 Ubuntu 17.10上为第一台计算机添加结果.

sam*_*amu 10

请记住,Python是一种非常高级的编程语言,Pandas也是一个高级框架.

您实际使用的是用于许多操作的高级API,您可以使用该语言执行该操作,而无需担心底层实现.

如果您使用较低级别的API,要将数组分配给变量,您必须分配一些内存,创建一个结构来保存数据,将它们链接在一起(可能使用指向内存地址的指针).而你甚至没有触及实际芯片,你的API和保存到芯片的实际数据之间仍然存在虚拟内存映射.而这种复杂性基本上适用于您使用Python和Pandas所做的一切.

然而,你只需要做arr = [1, 2, 3],而不是担心它.

现在,Python应该在您运行它的每个平台上运行相同 - 至少在大多数情况下.

现在,在无聊的介绍落后于我们之后 - "暴露统一API,不担心实现"的整个想法在计算机编程中得到广泛传播.有一些微妙的实现细节使一个操作系统与另一个操作系统不同,这可能会也可能不会影响软件的性能.我不认为这很重要,但它仍然存在,值得一提.

例如,有关np.dotLinux和Windows之间功能性能不同旧答案.作者在这个问题上对我的了解比我更多,并指出该特定函数是CBLAS例程的包装器,它将使用给定平台上可用的最快例程.

话虽这么说 - 熊猫是一个非常复杂的库,旨在通过向程序员展示简单易用的API,使数据分析尽可能简单.我希望Pandas可以使用您平台上可用的最佳机制尽可能快地完成任务.