gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:32:42 27 4
gpt4 key购买 nike

阅读有趣的书"From Python to Numpy"我遇到了一个 example ,其说明如下:

Let's consider a simple example where we want to clear all the values from an array which has the dtype np.float32. How does one write it to maximize speed?

提供的结果让我感到惊讶,当我重新检查它们时,我得到了完全不同的行为。于是,我让作者再次检查,但他在下表中得到了与之前相同的结果(OS X 10):

变体在三台不同的计算机上计时:我的(Win10Win7)和作者的(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 |

正如您从该表中看到的,在 Windows 上,结果并不取决于查看的类型,但在 OS X 上,这种 hack 会极大地影响性能。 您能否解释一下为什么会发生这种情况?

编辑:正如我上面写的,三台电脑是不同的。

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

第二台电脑的规范: window 7
CPU:英特尔奔腾 P6100 2.00GHz
内存:4GB DDR3-1333

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

Link to the issue

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

最佳答案

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

本质上,您使用的是一个高级 API,您可以使用该语言执行许多操作,而无需担心底层实现。

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

然而,你只需要arr = [1, 2, 3],不用担心。

现在预计 Python 在您运行它的每个平台上都能以相同的方式工作 - 至少在大多数情况下是这样。

现在,无聊的介绍已经过去了——“公开统一的 API,不用担心实现”的整个思想在计算机编程中广泛传播。有一些细微的实现细节使一个操作系统与另一个不同,这可能会也可能不会影响您的软件的性能。我不认为这很重要,但它仍然存在并且值得一提。

例如,有一个 old answer about np.dot function performance differing between Linux and Windows .作者在这个主题上比我有更多的知识,并指出该特定函数是 CBLAS 例程的包装器,它将使用给定平台上可用的最快例程。

话虽如此,pandas 是一个非常复杂的库,旨在通过向程序员提供易于使用的 API,使数据分析尽可能简单。我希望 Pandas 在更多的地方使用您平台上可用的最佳机制来尽可能快地执行其任务。

关于python - numpy 的性能是否因操作系统而异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541307/

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