【问题标题】:Question on mixed Python performance results from PC vs smartphone关于 PC 与智能手机混合 Python 性能结果的问题
【发布时间】:2021-11-30 13:23:04
【问题描述】:

我在 PC 和智能手机上做了一些 Python 性能比较,结果令人困惑。

PC:i7-8750H / 32GB RAM / 1TB SSD / Windows 10
智能手机:Android 11 上带有 Termux Linux 模拟器的 Galaxy S10

第一个是简单的蒙特卡罗模拟,代码如下。

import random
import time

def monte_carlo_pi(n_samples: int):
    acc = 0
    for i in range(n_samples):
        x = random.random()
        y = random.random()
        if (x**2 + y**2) < 1.0:
            acc += 1
    return 4.0 * acc / n_samples

start_time = time.time()

print(monte_carlo_pi(10000000))
print(time.time()-start_time)

令人惊讶的是,PC 大约需要 5.2 秒,智能手机大约需要 2.7 秒。

其次是使用带有一些数据框操作的 pandas。

import pandas as pd
import time

start_time = time.time()

df = pd.DataFrame(
    [ [21, 72, -67], 
      [23, 78, 62],
      [32, 74, 54],
      [52, 54, 76],
      [0, 23, 66],
      [2, 1, 2] ],
    index = [11, 22, 33, 44, 55, 66],
    columns = ['a', 'b', 'c'])

df2 = pd.DataFrame()

df2 = pd.concat([df2, df['a']], axis=1)
df2 = pd.concat([df2, df['c']], axis=1)

print(df2)
print(time.time()-start_time)

这一次,PC 大约是 0.007 秒,智能手机大约是 0.009 秒,但实际时间来自 exec。完成智能手机大约需要 2 秒。我的猜测是智能手机加载冗长的熊猫包需要更长的时间,但不确定。

  1. ARM 处理器在简单的重复计算上是否更快?或者其中一个处理器是否使用多核功能?
  2. 如上所述,智能手机读取冗长包裹的速度是否相对较慢?
  3. 是否有更好的方法来衡量 PC 和智能手机之间的整体 Python 性能?

【问题讨论】:

    标签: python performance comparison


    【解决方案1】:

    Python 代码的执行时间受限于开销。实际上,调用random.random() 需要花费大量时间来考虑迭代次数和一次迭代的时间。这来自缓慢的模块获取。您可以使用rand = random.random 缓存函数。此外,x**2 + y**2 也没有优化。 x*x + y*y 可以用来加速计算。此外,您也不需要分支:您可以使用acc += (x*x + y*y) &lt; 1.0。这是生成的代码:

    def monte_carlo_pi(n_samples: int):
        acc = 0
        rand = random.random
        for i in range(n_samples):
            x = rand()
            y = rand()
            acc += (x*x + y*y) < 1.0
        return 4.0 * acc / n_samples
    

    这段代码在我的机器上快了大约 3 倍。与本机代码相比,它仍然很慢。例如,在这个简单的代码上使用 Numba JIT 甚至快 12 倍(与原始代码相比是 35 倍)。 这种缓慢的执行来自标准 CPython 解释器本身。您可以尝试 PyPy(基于 JIT 的解释器)是否希望这样的代码在不更改代码本身的情况下更快地执行。

    最后,请注意 Numpy 包通常用于此类代码,以便获得有效的代码。

    ARM 处理器在简单的重复计算上是否更快?或者是否有任何一个处理器使用多核功能?

    两者都不是。由于在两个不同平台上的编译方式,解释器的速度可能会发生变化。此外,操作系统可以对代码的性能(通常是分配的速度)发挥重要作用。在您的情况下,一个代码在 Windows 上运行,而另一个代码在 Android(类似 Linux)上运行。 AFAIK,Windows 上的对象分配速度明显较慢。

    如上所述,智能手机读取冗长包裹的速度相对较慢吗?

    这非常依赖于您的硬件,尤其是您的存储设备、RAM 和 CPU。文件系统以及操作系统本身也发挥着重要作用。要知道为什么平台比其他平台慢,最好的方法就是使用分析器

    有没有更好的方法来衡量 PC 和智能手机之间的整体 Python 性能?

    有几个基准可以评估 Python 实现在多个平台上的性能。其中之一是this one。基准测试非常困难(尤其是微基准测试),因为由于缺少因素,您很容易得出错误的结论。考虑一下您真正想要测量的内容,然后将所有可能的噪声源减少到零,因为一次比较多个因素是基准测试错误的主要来源。例如,在两台设备上使用相同的操作系统(例如,Android 或至少具有相同内核版本和类似配置/标志的基于 Linux 的系统)。您应该使用完全相同的CPython 版本。您还应该使用 same compilersame flags 自己编译 CPython(或者可能使用等效的预编译二进制文件)。库/包的版本通常也很重要。对于 libc(标准 C 库)和 GMP(高效计算大数的库)尤其如此。如果要测量与之相关的事物,还应该使用具有相同文件系统的分区。我可能遗漏了许多重要的观点。有时一个代码可能比另一个代码慢得多,因为它是not aligned the same way in memory(以及关于目标平台的对齐策略更改)!甚至the size of the code matters 很多。这就是为什么您应该使用 profiler(例如,Linux 上的 perf 或 Windows 上的 VTune)检查为什么相同的代码在不同的上下文中变慢/变快的原因。

    以下是相关帖子:

    这里有一些有趣的谈话:

    【讨论】:

    • 感谢您的回复。当我试图将旧手机回收成有用的东西时,我更专注于两个不同平台之间的性能比较来衡量限制。对于 numba,我知道它可以显着提高 PC 上的速度,但我认为它不适用于 Termux。事实上,MC 示例取自 Wiki numba 页面。 :)
    • 你可能会对 Numba 感到惊讶;):它基于支持大多数 ARM 平台的 LLVM! PyPy 也应该支持 ARM,但我认为它目前还处于试验阶段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-12-09
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多