# Python

# Flag

由于Python是动态编译的语言,和C/C++Java或者Kotlin等静态语言不同,它是在运行时一句一句代码地边编译边执行的, 而Java是提前将高级语言编译成了JVM字节码,运行时直接通过JVM和机器打交道,所以进行密集计算时运行速度远高于动态编译语言。 但是根据二八定律(帕累托法则),有80%的计算资源只被20%的程序所使用,因此在大部分情况下, 原生的CPython解释器已经足够满足日常编程,加上很多科学计算库底层都是C/C++写的,一般不会用Python做密集计算。

test = Test() # 触发__del__
with Test() as t: # 触发__exit__
    pass

工具

# 三方编译器

PyPy使用了JIT(即时编译)技术,混合了动态编译和静态编译的特性,仍然是一句一句编译源代码, 但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。

# 安装新版

全部操作都在root用户下执行

# 安装编译相关工具

yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel \
ncurses-devel sqlite-devel readline-devel tk-devel \
gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

# 下载安装包解压

  • 到官网复制最新版下载地址 https://www.python.org/downloads/release
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
# 解压
tar -xvJf Python-3.7.3.tar.xz
# 切换到解压目录
cd Python-3.7.3

# 编译安装

# 创建编译安装目录,并配置指定安装路径
mkdir /usr/local/python3 && ./configure --prefix=/usr/local/python3
# 编译安装并把安装日志保存下来
make && make install > install.log

# 创建软连接

ln -s /usr/local/python3/bin/python3 /bin/python3
ln -s /usr/local/python3/bin/pip3 /bin/pip3

# 验证是否成功

python3 -V && pip3 -V

# 安装后yum不能正常使用

  • #!/usr/bin/python 修改为 #!/usr/bin/python2
vi /usr/bin/yum 
  • #!/usr/bin/python 修改为 #!/usr/bin/python2
vi /usr/libexec/urlgrabber-ext-down 

# pip

  • sudo apt install python3-pip

# 镜像源

更多镜像源

  • 安装单个库
# 使用pip参数`-i 网址`,如果不是`https`协议网址需要加--trusted-host参数
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com requests
  • 使用命令全局配置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 编辑文件全局配置
# Linux环境
vi ~/.pip/pip.conf 
# windows环境
%APPDATA%\Romaing\pip\pip.ini

# 添加或者修改
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

# 生成依赖管理文件

# 对于没有使用虚拟环境,会把系统所有的包都导出
pip freeze > requirements.txt
# pipreqs则只导出当前项目依赖库,如果文件存在可以使用--force覆盖,默认不会覆盖
pipreqs --force --encoding utf-8 ./

# 根据管理文件安装依赖

pip install -r requirements.txt
pip install --requirement requirements.txt

# 更新依赖库

更新pip

python -m pip install --upgrade pip setuptools
  • 解决pip安装模块提示已经安装更高版本问题
pip3 install --ignore-installed 模块名

查看可更新的库

# --outdated
pip list -o
# format有两个选项:columns(有表头), freeze(无表头), json
pip list --outdated --format=columns

更新单个库

pip install --upgrade 要升级的包名

批量更新库

#  linux 下升级所有 pip 过期包
pip install `pip list --outdate | sed -n '3,$p' | awk '{print $1}'` --upgrade
pip freeze --local | grep -v '^-e' | cut -d = -f 1  | xargs -n1 pip install -U
pip list -o --format=freeze | cut -d = -f 1  | xargs -n1 pip install -U
# 安装 pip-review
pip install pip-review
# 查看可更新的包
pip-review
# 自动更新所有包
pip-review --auto
# 更新包,提供操作可选项:[Y]es, [N]o, [A]ll, [Q]uit
pip-review --local --interactive
from subprocess import call
from pip._internal.utils.misc import get_installed_distributions

packages = [dist.project_name for dist in get_installed_distributions()]
call("pip install --upgrade" + ' '.join(packages), shell=True)
import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade" + ' '.join(packages), shell=True)

# 卸载依赖库

pip uninstall 要卸载的包名