PYTHON 运行机制介绍
- 编译器
- Cython 针对数值计算
将python写的代码.py文件,通过Cpython编译器编译变为C语言代码,加速执行。。
Cython 使得 Python 语言的 C 扩展与 Python 本身一样简单。Cython 是基于 Pyrx 的源代码转换器,但支持更多的边缘功能和优化。Cython 语言是 Python 语言的一个超集(几乎所有的 Python 代码是有效的)还支持可选的静态类型来调用 C 函数,声明 C 类型变量和类的属性。这允许编译器从 Cython 代码生成非常高效的 C 代码。这使得 Cython 编写外部 C/C++库代码的理想语言,和快速的 C 模块,提高Python 代码的执行速度。广泛应用于数值计算包的编译,如 numpy 等,编译器可以通过 pip 实现:pip install cython
- Cython 针对数值计算
该编译器会引入 GIL(全局解释锁)问题,CPU 密集型程序建议使用 python 调用动态链接库的方式提升运行效率
- PyPy 正确情况下
python 源代码 .py====> python 字节码 .pyc ======>运行虚拟机 - Jython
首先将 python 编译为基于 java 字节码的字节码文件,然后在 java 虚拟机 jvm 上运行 java 字节码。 - Ironpython
将 python 编译为基于.NET 的 CLI 的中间语言文件,然后在.NET 框架上执行程序。
-
字节码和虚拟机
pyc 文件是 py 文件编译后生成的字节码文件(byte code),pyc 文件经过 python 解释器最终会生成机器码运行。所以 pyc 文件是可以跨平台部署的,类似 Java 的.class 文件。Pyc 文件可以打包分发从而避免源代码被暴露出来。python 先把代码(.py 文件)编译成字节码,交给字节码虚拟机,然后虚拟机会从编译得到的 PyCodeObject 对象中一条一条执行字节码指令,并在当前的上下文环境中执行这条字节码指令,从而完成程序的执行。
字节码对象的创建时机是模块加载的时候,即 import 时,执行过程如下:
1、执行 python main.py 会对 main.py 进行编译成字节码并解释执行,但不会生成
test.pyc
2、如果 main.py 中加载了其他模块,如 from mytest import myfun,那么 python会对 myfun.py 进行编译成字节码,生成 myfun.pyc,然后对字节码解释执行。
3、如果想生成 main.pyc,我们可以使用 python 内置模块 py_compile 来编译。也可以执行命令 python -m main.py 这样,就生成了 main.pyc
4、加载模块时,如果同时存在.py 和.pyc,python 会使用.pyc 运行 -
程序打包
- 利用 setuptools 实现本地文件安装(egg 打包)
当我们生成.pyc文件后,需将其进行egg打包
当我们代码调试完成后,需要在项目目录下写setup.py脚本,
并在项目目录下执行python setup.py install, 会生成dist目录,并包含.egg文件,可以将.egg文件上传到pipy,可以通过pip install xxx 进行下载 - wheel 打包
首先,你需要安装 wheel 包:
pip install wheel
下一步,我们将使用 unidecode 包来创建我们的第一个 wheel,因为当我在写本文
的时候,我们的 wheel 包还没有创建出来,接下来我会在多个项目中使用这个包。
pip wheel --wheel-dir=my_wheels Unidecode
在 my_wheels 文件夹中有了名字为 Unidecode-0.04.14-py26-none-any.whl 的
wheel。.whl 文件有一点与.egg 文件相似:实际上它们都是“伪装的”.zip 文件。如
果你将.whl 文件名扩展改为*.zip,你就可以使用你的 zip 应用程序打开它,并且可以
查看它包含的文件和文件夹。
高阶编程
请大家移步到相关教学网站去深入学习
其他知识点
- 虚拟环境--沙箱机制
-
virtualenv
image.png
-
Pycharm 自动使用虚拟环境
项目中一般如此使用
image.png
- pip
- 安装与卸载
pip install xxx == 2.1.7
pip uninstall xxx - 环境配置
pip freeze > requirements.txt
pip install -r requirements.txt
- init.py
- ALL = ['myfun','tesx'] 可以外部调用的方法
- private 私有方法
- 为空,默认可以调用所有方法
网友评论