为何M1 Max原生运行Numpy速度远低于旧款Intel i5处理器?
M1 Max MacBook Pro Python环境运行速度异常问题
核心问题
- 为何M1 Max原生运行Python的速度比2016款搭载Intel i5的旧MacBook Pro慢约100%?
- M1 Max上通过Miniforge原生运行和通过Anaconda借助Rosetta转译运行的速度无显著差异,不符合转译运行预期慢20%的结论,原因是什么?
- M1 Max原生运行场景下,conda安装的Numpy和随TensorFlow安装的M1优化版Numpy无显著速度差,不符合优化版更快的预期,是什么原因?
- M1 Max上在Apple Silicon版PyCharm中运行代码的速度恒定比终端运行慢约20%,该情况未在旧Intel Mac上出现,原因是什么?
对照测试设置
1. Python安装来源
- Miniforge-arm64:Python可在M1 Max芯片上原生运行,可通过活动监视器验证,Python进程的
Kind属性为Apple。 - Anaconda:Python通过Rosetta转译运行,可通过活动监视器验证,Python进程的
Kind属性为Intel。
2. Numpy安装方式
conda install numpy:从conda-forge渠道安装的Numpy,或Anaconda预装的Numpy版本。- Apple-TensorFlow配套安装:在Miniforge安装的Python环境中安装TensorFlow时会同步安装适配M1优化的Numpy,官方说明该版本速度更快,安装命令如下:
conda install -c apple tensorflow-deps python -m pip install tensorflow-macos python -m pip install tensorflow-metal
3. 运行环境
- 终端
- Apple Silicon版PyCharm
测试代码
import time import numpy as np np.random.seed(42) a = np.random.uniform(size=(300, 300)) runtimes = 10 timecosts = [] for _ in range(runtimes): s_time = time.time() for i in range(100): a += 1 np.linalg.svd(a) timecosts.append(time.time() - s_time) print(f'mean of {runtimes} runs: {np.mean(timecosts):.5f}s')
测试结果
+-----------------------------------+-----------------------+--------------------+ | Python安装来源(运行模式)→ | Miniforge(M1原生) | Anaconda(Rosetta转译) | +----------------------+------------+------------+----------+----------+---------+ | Numpy安装来源 ↓ | 运行环境 → | 终端 | PyCharm | 终端 | PyCharm | +----------------------+------------+------------+----------+----------+---------+ | Apple Tensorflow配套 | 4.19151 | 4.86248 | / | / | +-----------------------------------+------------+----------+----------+---------+ | conda install numpy安装 | 4.29386 | 4.98370 | 4.10029 | 4.99271 | +-----------------------------------+------------+----------+----------+---------+
对照参考数据
- 相同代码在2016款搭载i5芯片的旧MacBook Pro上运行耗时为*
2.39917s*。 - 公开测试内容显示,普通M1芯片(非Pro/Max版本)使用Miniforge+conda安装Numpy的运行耗时为*
2.53214s,使用Miniforge+Apple TensorFlow配套Numpy的运行耗时仅为1.00613s*。
设备参数
2016款Intel i5 MacBook Pro
$ sysctl -a | grep -e brand_string -e cpu.core_count machdep.cpu.brand_string: Intel(R) Core(TM) i5-6360U CPU @ 2.00GHz machdep.cpu.core_count: 2
M1 Max MacBook Pro
% sysctl -a | grep -e brand_string -e cpu.core_count machdep.cpu.brand_string: Apple M1 Max machdep.cpu.core_count: 10
原因分析与解决方案
1. 整体速度偏慢的核心原因
你当前的Numpy没有调用Apple的Accelerate框架加速线性代数运算,普通conda-forge默认安装的numpy是基于OpenBLAS编译的,M1平台上OpenBLAS的svd算子优化程度远低于Accelerate框架的实现,这也是你和公开测试结果差异巨大的核心原因。
可先验证当前numpy的blas后端:执行np.__config__.show(),如果输出中没有Accelerate相关字样,就说明没有调用苹果的加速框架。
2. 原生与Rosetta运行无差异的原因
Rosetta转译的 overhead 主要集中在逻辑分支密集的纯Python代码,而你测试的核心负载是numpy的svd运算,属于BLAS库的纯C实现,转译开销占比极低,所以几乎看不出差异。
3. 优化版Numpy无效果的原因
你安装的Apple tensorflow配套numpy版本可能出现了版本覆盖,或者conda环境的路径优先级有问题,导致实际调用的还是默认的OpenBLAS版本numpy。可以执行pip list | grep numpy查看安装版本,确认是否是apple提供的优化版本。
4. PyCharm比终端慢20%的原因
Apple Silicon版PyCharm默认会开启代码覆盖率监控、调试器注入等后台进程,且默认的Python解释器路径加载优先级和终端不同,会额外加载PyCharm的运行时钩子。你可以关闭PyCharm的Python Debugger中的PyQt compatible选项,以及关闭代码实时检查功能,再对比运行速度。
可行修复步骤
- 完全卸载现有conda环境中的numpy:
conda uninstall numpy -y && pip uninstall numpy -y - 确保当前是arm64架构的终端(执行
arch输出arm64),使用conda从apple渠道安装优化版numpy:conda install -c apple numpy - 安装完成后再次执行
np.__config__.show()确认后端为Accelerate,再重新运行测试即可,正常情况下测试耗时会降到1s以内。
内容的提问来源于stack exchange,提问作者graphitump
相关产品推荐
相关产品推荐

