Performant Python
Python 性能
计算机结构
简单来说,计算机由计算单元、储存单元和二者之间的通信构成。
计算单元
计算单元一般是 CPU 和 GPU 等。
计算单元重要的两个参数是
- 每周期指令 (instructions per cycle, IPC): 每个时钟周期执行的指令数
- 时钟速度:每秒的时钟周期
如果提高时钟速度了,当然运行速度会变快。另一种方法是增加每个指令的计算量,通过向量化的方式,可以在一个指令中同时处理多个数据,即 SIMD(single instruction multiple data).
由于物理和技术限制,时钟速度的增加基本停止了,所以增加同一时间内运算量的方法就是增加更多的 CPU, 即并行化。
Amdahl'a law
经验定律:并行程序的加速上限取决于不能并行化的最小单元。
存储单元
存储单元包括:机械硬盘、固态硬盘、RAM、L1/L2 等。主要的区别就是速度。一般来说速度越快容量越小。
存储单元速度通常比计算单元慢,所以主要的优化手段就是异步 I/O 和预先缓存,保证计算设备进行计算的时候数据已经准备好了。
总线
计算单元和存储单元通过总线连接。 总线最重要的参数是总线宽度和总线频率。
从源码安装 python
- openssl 通过
--with-openssl
指定 - sqlite 通过修改
setup.py
中的sqlite_inc_paths
-
libffi 通过
CPPFLAGS
,LDFLAGS
指定参考编译选项
./configure --prefix=$HOME/app/python --enable-optimizations --with-openssl=$HOME/app/openssl --enable-shared PKG_CONFIG_LIBDIR=$PKG_CONFIG_PATH LIBFFI_INCLUDEDIR=/vol7/home/zhongpg/app/libffi/include --with-system-ffi=/vol7/home/zhongpg/app/libffi/lib64 CPPFLAGS="-I /vol7/home/zhongpg/app/libffi/include" LDFLAGS="-L/vol7/home/zhongpg/app/libffi/lib64"
从源码安装 numpy, scipy
- numpy 依赖
- cython:
pip install cython
- cython:
- scipy 依赖
- pybind11:
pip install "pybind11[global]"
- pythran:
pip install pythran
- 执行
git submodule update --init
来自动下载一些包
- pybind11:
设置 site.cfg
执行安装
python3 setup.py build -j 10 install
评论
Comments powered by Disqus