为何Python3循环比Node.js慢数十倍?附测试与优化疑问
O(n²)算法性能测试与Python代码优化
部分读者质疑该测试的合理性,但如果目标是了解O(n²)算法在n=10000或100000时的最低预期运行时间,下述测试完全有效。
JavaScript测试实现
const n = 10000; const n2 = n * n; let a = 0; for (let i = 0; i < n2; i++) { a += 3.1; a -= 1.01; a -= 2.0001; } console.log(a);
运行结果
$ time node try.js node try.js 0.31s user 0.01s system 98% cpu 0.321 total
耗时约0.32秒。
Python3测试实现
n = 10000 n2 = n * n a = 0 for i in range(n2): a += 3.1 a -= 1.01 a -= 2.0001 print(a)
运行结果
$ time python3 try.py python3 try.py 9.88s user 0.04s system 99% cpu 9.948 total
耗时约9.88秒,JavaScript代码速度是Python3的30倍。
用户提到Python2中可使用xrange(),但Python3的range()是生成器不会生成大数组,疑惑自身操作是否有误,同时希望将Python3代码优化至1秒内。
可行的Python优化方案
- 改用PyPy解释器:PyPy采用JIT编译技术,对循环密集型代码的优化效果显著,这类简单循环的运行速度可接近JavaScript,能轻松将耗时压到1秒内。
- 简化循环内计算逻辑:预计算循环内的数值操作,减少循环中的计算步骤:
n = 10000 n2 = n * n a = 0.0 delta = 3.1 - 1.01 - 2.0001 for i in range(n2): a += delta print(a)
- 使用NumPy向量化运算:利用NumPy的底层C实现绕过Python循环开销,直接完成批量计算:
import numpy as np n = 10000 n2 = n * n delta = 3.1 - 1.01 - 2.0001 a = delta * n2 print(a)
该版本无Python循环,运行时间远低于1秒。
内容的提问来源于stack exchange,提问作者Stefanie Gauss
相关产品推荐
相关产品推荐

