65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Python 构建原生 Windows on Arm 应用

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2023年5月15日

CPOL

5分钟阅读

viewsIcon

5288

本文演示了在 Arm 驱动的设备上使用原生的 Arm Python 3.11 的便捷性,与使用仿真模式相比,可以获得高达三倍的性能提升。

Arm 架构为边缘计算和移动设备带来了强大的性能和效率,特别是对于较新的 Windows on Arm (WoA) 设备。

Python 是一种广泛使用的编程语言,现在通过 Windows 对 Arm 平台提供了原生支持。从 Python 3.11 开始,WoA 的 官方安装程序现已推出,是时候开始针对 WoA 进行开发了。

本文演示了在 Arm 驱动的设备上使用原生的 Arm Python 3.11 的便捷性,与使用仿真模式相比,可以获得高达三倍的性能提升。

Arm 上的 Python

CPython 提供官方的 Python 实现及其标准库。它在解释之前将代码编译成字节码,使其能够包含特定于平台的代码。您可以使用 ARM64 安装程序 或从 Nuget 获取的旧版本进行安装,或者直接从源代码构建。

必备组件

本教程使用 Windows Dev Kit 2023 (Project Volterra) 进行开发。但是,您可以在 Surface Pro 9 5G、Lenovo X13s 或 Apple silicon 设备上通过使用 Parallels Desktop 运行 Windows 11 来获得类似的性能提升。

设置

要设置 Python 的原生 Arm 支持,您需要原生的 Arm C 构建工具。正如 Arm 文档中所解释的那样,您可以使用独立安装程序或通过 Visual Studio 2022 Community 进行 C++ 桌面开发来安装它们。这确保了原生 Arm C 构建工具的可用性。或者,您也可以使用构建工具的独立安装程序。

安装 Visual Studio 后,切换到适用于 Arm64 的 Visual Studio Code (VS Code) 进行开发,这样您就可以使用其内置的 Python 工具。

安装 VS Code 后,安装 Python 扩展。

在此演示中,您将安装 Arm64 特定 Python 和标准的非 Arm Python,以便进行比较和对比。

首先,安装 Arm64 Python 3.11,然后安装 x64 Python 3.11。为了简单和一致,请选择默认设置。

默认情况下,Python 会将这两个包安装在以下文件路径下

Users\<User_name>\AppData\Local\Programs\Python

有两个子文件夹:Python311 用于 x64 版本,Python311-arm64 用于 Arm64 版本。通过运行每个子文件夹中的 python.exe,您可以看到它们是用不同的 64 位 Microsoft C 编译器构建的:AMD64 或 ARM64。

或者,要查看不同的 Python 版本,您可以调用 py –3.11 或 py –3.11-arm64。

安装过程很简单。但是,由于 x64 和 Arm64 的 Python 使用不同的 C 编译器,Python 包可能会存在兼容性和移植性问题。传统上,您使用 pip 安装 Python 包,它会自动安装依赖项。首先,pip 会尝试查找平台无关的包(称为 wheel)。然后,它会查找特定于平台的包,最终从源代码构建它。

Arm64 上的 Python 包

如果您正在编写 Python 包以利用 Arm64,您必须确保为 Arm64 编译您的包,而不是 x64。对于纯粹(平台无关)的 Python 包,不存在这个问题。

将 Python 目录设置为您的工作目录

cd: Users\<User_name>\AppData\Local\Programs\Python

现在,键入以下命令来设置 x64

Python311\python.exe -m pip install --upgrade pip

这将 pip 升级到最新版本。

现在,安装 NumPy 包,您稍后将使用它来实现您的示例应用程序。要安装 NumPy,请输入

Python311\Scripts\pip.exe install numpy

您会看到它下载了 x64 Python 的特定于平台的 NumPy wheel。

现在,为 Arm64 版本的 Python 重复此过程

Python311-Arm64\python.exe -m pip install --upgrade pip
Python311-arm64\Scripts\pip.exe install numpy

对于 Arm64,没有特定于平台的 wheel。因此,pip 会下载并从源代码构建包以创建本地 Arm64 包 wheel。

开发

现在,您已经拥有了实现实际 Python 应用所需的所有工具。

首先,在 PythonOnWoa 目录中创建一个新文件 sample.py

然后,导入 NumPy 和 time 包。

import numpy as np
import time

第一个包用于数值计算,第二个包用于测量计算时间。

接下来,定义一个计算信号快速傅里叶变换 (FFT) 的函数。在这里,信号由具有一些随机噪声的单频正弦波组成。

多次重复 FFT(trial_count)以获得稳定的计算时间估计。

def perform_sin_fft(signal_length, frequency, trial_count):    
    start = time.time()
    
    for i in np.arange(1, trial_count+1):
        ramp = np.linspace(0, 2 * np.pi, signal_length)
        noise = np.random.rand(signal_length) 
 
        input_signal = np.sin(ramp * frequency) + 0.1*noise
        np.fft.fft(input_signal)
    
    computation_time = time.time() - start
 
    return computation_time

上述函数返回计算 FFT 所需的总时间(以秒为单位)。

要测量性能,请为各种信号长度调用 perform_sin_fft 函数。

signal_lengths = [2**10, 2**11, 2**12, 2**13, 2**14]
trial_count = 5000
 
for signal_length in signal_lengths:
    frequency = int(signal_length / 4)
    computation_time = perform_sin_fft(signal_length, frequency, trial_count)
    print("Signal length {}, Computation time {:.3f} s".format(signal_length, computation_time))

现在,使用 Arm64 和非 Arm64 Python 3.11 运行此脚本以测量性能差异

.\Python311\python.exe <path_to_your_sample.py>
.\Python311-arm64\python.exe <path_to_your_sample.py>

第一个命令使用 x64 仿真模式执行脚本。计算时间取决于信号长度。具体来说,对于 16,384 点,计算时间为 6.86 秒。第二个命令使用 Arm64 Python,产生更短的计算时间。相同的 16,384 点计算耗时 2.72 秒,计算时间减少到仿真模式(x64)所需时间的约 40%。这种差异代表了比仿真模式快约两倍半的性能提升。

此图说明了计算时间和相应的性能提升。

Arm 上 Python 的未来

Python 3.11 结合原生的 Arm64 为希望充分利用 Windows 11 上 Arm 驱动设备的 Python 开发人员带来了巨大的机遇。随着越来越多的开发人员为其 Python 包添加支持,您将看到更多的性能改进。

一个例子是 Linaro 的演示,展示了如何将 TensorFlow 移植到 Arm64,该演示显示出惊人的速度提升,并为依赖 Python 的易用性和强大功能的 AI、数据科学家和研究人员提供了巨大的可能性。

结论

本文指导您在 Windows 11 上安装原生的 Arm64 Python 3.11,包括设置您的开发环境以确保所有必需的工具都已就位。

您编写了一个简单的模块,对信号应用了快速傅里叶变换,并看到了 Arm64 Python 所带来的性能改进。这种性能提升加速了对 WoA 的支持。许多公司正在积极参与移植库和工具集,以便他们能够利用 Arm64 加速 Python 工作负载。

立即开始使用 WoA,并从 官方 WoA 安装程序 中尝试 Python 3.11,以从您的 Arm 设备获得您所需强大的性能和您所要求的效率。

© . All rights reserved.