python html5 bootstrap 视频教程

德云社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 240|回复: 0

如何使用Cython才能效率最高 language_level compiler_directives变量

[复制链接]

53

主题

96

帖子

2988

积分

管理员

Rank: 9Rank: 9Rank: 9

金钱
2830
金币
3
威望
0
贡献
0
发表于 2020-4-16 18:34:43 | 显示全部楼层 |阅读模式
如何使用Cython才能效率最高 language_level compiler_directives变量

这几年随着 Python 的流行,Cython 也跟着火了,那什么是 Cython 呢?Cython 是 C/C++ 和 Python 的结合体,基于 Pyrex 开发,故称为 Cython。Cython 主要用于将采用 C/C++ 编程语言编写的 .c 文件或采用 Python 编程语言编写的 .py .pyw 文件编译 打包成 .pyd 模块文件,当然也能编译采用 Cython 规范编写的 .pyx pxd 文件。

Dython 是 Digitser (或 Digitizing Digital Digitization Data 或 Data technology) 和 Python 的结合体,故称为 Dython。Dython 由德云社区基于自身的数字化技术理念提出,乐数软件开发 维护的很多应用都有 Python Cython 的影子;而 Dython 则是 Cython  Python 的一种统称,也是一种数字化理念的抽象。譬如 DyWeb DyERP DyPLM 中的 Dy,文字被简化但含义不变。


智能编辑重构 批处理式 "数字 Python IDE" 集成开发环境 (集成快速高效 Cython PyInstaller 批处理小程序)

http://dt.digitser.cn/zh-CN/ide/idepy/index.html

http://idepy.digitser.cn/


pyd 文件

.pyd 文件是由非 Python,其它编程语言编写 (或直接把 .py 文件转换成 .c 中间文件) 编译生成的 Python 扩展模块,是类似 .so .dll 动态链接库的一种 Python 文件。


每个 .pyd 文件实际上都封装了一个 Python module 模块。使用时,采用 import 路径名.modulename 或 from 路径名.modulename import ** 语言,路径名为 .pyd 文件所在的路径。


基于 Qt GUI (图形用户界面) 框架的 PyQt PySide for Python 绑定,会为每个二次开发胶水代码所对应的 Qt/C++ 库 .dll 文件生成一个中间 .pyd 文件。PyWin32 项目分发包中,也存在很多 MicroSoft Windows OS 相应 .dll 文件的中间 .pyd 文件 (包括编译好的 Cython 模块本身)。


Cython 可将个人基于 Python 语言编写的 Python 模块编译成具有 C 语言特性的 .pyd 文件。由于 .pyc .pyo 文件很容易被反编译出源码,而采用 .pyd 文件在这方面就有不少优势 (当比较 Cython 编译前后源码 结果就能看出)。


01.png
源码 Cython v3.1.4.2 build 20200413.181959

源码 Cython 化批处理工具

工具名 源码 Cython,打包分布 .exe 文件请使用 源码 PyInstaller


以后不用再一条条输命令,且效率不是一般的高,此工具也是国内外首个深度集成 Cython 的大批量高效处理工具。


若有使用外部或自定义模块, 请把相应路径添加到控制台配置对话框 PATH 变量框中,批量生成的 .PYD 文件, 都会被移到源代码目录下。


.PY 源代码经 Cython 化后有一些效率提升, 虽不是很明显但能感觉到 (要求更高请编写 .py .pyw .c 文件)。Cython 文档编制,快速入门教程在此。


Cython 会先把 .PXD .PY .PYW .PYX 文件转换成 .C 中间代码, 再编译成 .PYD 模块文件; 因此, 反编译 .PYD 文件只能获得 .C 中间代码 (无法获得最初源代码)。


编译时会根据所调用的 Python 解释器版本,自动切换 校正 .C 中间代码相应 2.7 3.x 语言级别 (自动配置 compiler_directives language_level  变量对应关系); 但须按以下代码形式, 编写 setup.py 编译配置文件 (这是目前,后期会增加自动生成功能):


Python2.7
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3. #

  4. __version__ = "0.1.7.1 build 20200301.060127" #采用全文替换小程序批量修改时,勾选文件版本复选框会自动更新
  5. from distutils.core import setup
  6. from Cython.Build import cythonize

  7. #以下代码排版形式须严格遵守
  8. modules = [
  9.     "text.py"] #平时仅修改此处的要编译模块名,__init__.py 不支持编译
  10. setup(
  11.     ext_modules = cythonize(modules),
  12. )
复制代码

Python3.x
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. #

  4. __version__ = "0.1.7.1 build 20200301.060127" #采用全文替换小程序批量修改时,勾选文件版本复选框会自动更新
  5. from distutils.core import setup
  6. from Cython.Build import cythonize

  7. #以下代码排版形式须严格遵守
  8. modules = [
  9.     "text.py"] #平时仅修改此处的要编译模块名,__init__.py 不支持编译
  10. setup(
  11.     ext_modules = cythonize(modules),
  12. )
复制代码

扫一扫关注 德云社区

更新时间:2020.04.16

版权声明:本文为独家原创稿件,版权归 德云社区,未经许可不得转载;否则,将追究其法律责任。
AI人工智能 语音助理 人工翻译 教程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|Sitemap|小黑屋|  |网站地图  

GMT+8, 2020-5-27 04:43 , Processed in 0.047081 second(s), 33 queries .

技术支持 乐数软件     版权所有 © 2014-2020 德云社区

工业和信息化部: 粤ICP备14079481号-2

快速回复 返回顶部 返回列表