Performant Python

Python 性能

计算机结构

简单来说,计算机由计算单元、储存单元和二者之间的通信构成。

计算单元

计算单元一般是 CPU 和 GPU 等。

计算单元重要的两个参数是

  1. 每周期指令 (instructions per cycle, IPC): 每个时钟周期执行的指令数
  2. 时钟速度:每秒的时钟周期

如果提高时钟速度了,当然运行速度会变快。另一种方法是增加每个指令的计算量,通过向量化的方式,可以在一个指令中同时处理多个数据,即 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
  • scipy 依赖
    • pybind11: pip install "pybind11[global]"
    • pythran: pip install pythran
    • 执行 git submodule update --init 来自动下载一些包

设置 site.cfg

执行安装

  python3 setup.py build -j 10 install

评论

Comments powered by Disqus