2022.2.21更新

  • python程序执行效率是明显低于c的。
  • 优化python代码的一个思路就是:将python的核心代码(一般是需要多次调用,或核心循环部分)转换成c语言。
  • 不需要将程序重新改写成c,只需要用Cython包将python程序进行转换即可。

1.Cython包

  • Cython包的安装参见https://pypi.org/project/Cython/
    pip install Cython
    conda install Cython
  • 一般安装anaconda的时候就带有Cython包;可以查看一下是否已经有这个包了。(直接在程序里 import Cython,若不报错就说明有;也可以通过pip list等查看)

2.python–>c

2.1

  • 将需要转换的程序重命名为xxxx.pyx;
    例如我有一个封装好的类.py文件word_frequency.py,需要重命名为word_frequency.pyx

2.2

  • 在相同的目录中创建一个文件setup.py;作用:使用cython编译器去编译pyx文件
from distutils.core import setup
from Cython.Build import cythonizesetup(ext_modules=cythonize("word_frequency.pyx"))

2.3

  • 开始编译,在命令行中:
    python setup.py build_ext --inplace
    (# inplace表示源代码在同一目录下)

  • 若编译成功,则在目录下会出现两个文件:word_frequency.cword_frequency.cp38-win_amd64.pyd(若在Linux平台下会出现word_frequency.cp38-win_amd64.so),此时.so文件或者.pyd文件就可以像普通的python文件一样,被import

  • 上述文件中word_frequency.c没有什么用,可以删除掉;word_frequency.cp38-win_amd64.pyd文件可以重命名为word_frequency.pyd不重新命名也可以,载入from word_frequency import word_frequency不受影响。

2.4

  • 在其他文件中正常调用word_frequency.pyd即可(可以将word_frequency.py改为其他名字,以免调用错)。
from word_frequency import word_frequency #一样的importwordFreq = word_frequency(dict_fullpath) #一样的使用方法

2.5

  • 对比
转换前:130.40097641944885 s
转换后:68.84645509719849 s
  • 速度只提升了一倍左右。
  • Cython能比常规Python代码快多少实际上取决于代码本身。例如,如果运行成本较高的多变量循环,Cython明显优于常规的Python代码。递归函数同样使得Cython快于Python。

3 关于.pyd文件

  • 若想对python文件进行加密,会把python模块编译成.pyd文件
  • pyd文件是由 D语言编写的一种dll 文件,目前还没有办法进行反编译,只能被反汇编。给python文件提供了很高的安全性。而且也可以编写一些python插件,方便python开发。



2022.2.22更新

4、python版本对.pyd文件加载的影响

出错点1:

  • 1)在python3.8.8版本将word_frequency.pyx编译成word_frequency.cp38-win_amd64.pyd
  • 2)在python3.8.8版本中,word_frequency.cp38-win_amd64.pyd能够被其他文件正常载入;from word_frequency import word_frequency没有问题。
  • 3)当把word_frequency.cp38-win_amd64.pyd移植到python3.7.4版本的电脑上时,from word_frequency import word_frequency会出现如下错误:

“我以为是高版本的python 编译的内容无法被低版本的python加载”
“所以,我把编译和加载的版本换了一下(移植顺序换了一下)”


出错点2:

  • 1)在python3.7.4版本将word_frequency.pyx编译成word_frequency.cp37-win_amd64.pyd
  • 2)在python3.7.4版本中,word_frequency.cp37-win_amd64.pyd能够被其他文件正常载入;from word_frequency import word_frequency没有问题。
  • 3)当把word_frequency.cp37-win_amd64.pyd移植到python3.8.8版本的电脑上时,from word_frequency import word_frequency同样会出现如下错误:

“所以,可能并不是高低版本兼容的问题”
“只能在对应的python版本上编译,然后加载运行;这意味着必须在本地编译,这就给用户操作上带来了一些麻烦;需要简化”
“将编译的代码也放在getWordFreq_Month.py中,虽然是本地编译,但是不需要用户操作命令行,即用户和原来的使用方法一样”


改善:

  • getWordFreq_Month.py中添加如下代码,(也要保证setup.pyword_frequency.pyx在相同目录下)
#将word_frequency.py编译成c
flag = True
file_list = os.listdir('./')
for file_name in file_list:#文件后缀是否有'.pyd'的file_suffix = os.path.splitext(file_name)[1]if file_suffix == '.pyd':flag = False#判断是否需要在本地重新编译
if flag:try:os.system('python setup.py build_ext --inplace')except:try:os.system('python3 setup.py build_ext --inplace')except:print('编译c存在问题!')sys.exit(0)#加载
from word_frequency import word_frequency



2022.2.23更新

5.如何彻底解决.pyd文件在其他python版本上无法加载的问题

出错点:

  • 1)虽然第4步的操作,把编译成c的过程放在了每台主机本地了,但是在一台python3.9版本的主机上,依然报错了:
  • 2)在一台python3.6版本的主机上也出现了错误:
  • 3)两个错误均是Unable to find vcvarsall.bat,查了一下vcvarsall.bat这个文件好像还和visual stdio相关,比较麻烦。
  • 4)出错的地方还是在编译的地方,就是python setup.py build_ext --inplace这句命令会出错。

“所以,虽然吧编译的程序放在了每台主机上,但是仍然会存在各种问题,移植性还是不好。”
“既然移植性不好搞定,那就直接封死吧,不再依赖python”


改善:
用pyinstaller将getWordFreq_Month.py文件封装成getWordFreq_Month.exe,可以脱离python环境。

  1. 安装pyinstaller
pip install pyinstaller
  1. 在.py目录中执行如下命令行:
pyinstaller -F getWordFreq_Month.py   #-F 选项,该选项指定生成单独的 EXE 文件,因此,在 dist 目录下生成了一个单独的大约为 6MB 的 xxxx.exe 文件
或者
pyinstaller -D getWordFreq_Month.py  #当生成完成后,将会在 xxxx目录下看到多了一个 dist 目录,并在该目录下看到有一个 xxxx 子目录,在该子目录下包含了大量 .dll 文件和 .pyz 文件,它们都是 xxxx.exe 程序的支撑文件。


via:手把手教你把Python代码转成exe
Python PyInstaller安装和使用教程(详解版)

  1. 执行xxxx.exe时,结果会一闪而过,所以需要通过命令来显示.exe文件的输出。在写一个start.bat文件,内容:
@echo off
dist\getWordFreq_Month\getWordFreq_Month.exe
pause

完工!

参考:

  • 如何优化你的python代码
  • Windows下Cython使用
  • windows cython快速入门

使用Cython提高python代码执行速度相关推荐

  1. python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用

    对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用. 1.PyPy:在选择 ...

  2. python 大项目使用cython_提升6.75倍!利用Cython为Python代码加速

    全文共2012字,预计学习时长4分钟 图片来源:Unsplash 如果你曾经用Python编写过代码,可能会发现等待某些代码块执行的时间比预期要长.尽管可以通过一些方法提高其代码效率,但它的反应速度仍 ...

  3. python代码加密cython_利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  4. cython python3_30倍!使用Cython加速Python代码

    原标题:30倍!使用Cython加速Python代码 作者:George Seif.Thomas Wolf.Lukas Frei 编译:1+1=6 | 公众号海外部 前言 你可能经常会一次又一次地听到 ...

  5. cython加密代码python_利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  6. 提高python执行效率_关于提高python程序执行效率的思路和想法

    原博文 2016-06-09 22:25 − 相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势--执行效率较低,为了让编写出 ...

  7. python执行效果_使用tqdm显示Python代码执行进度功能

    在使用Python执行一些比较耗时的操作时,为了方便观察进度,通常使用进度条的方式来可视化呈现.Python中的tqdm就是用来实现此功能的. 先来看看tqdm的进度条效果: tqdm的基本用法 tq ...

  8. python代码执行过程记录_这款神器,能把 Python 代码执行过程看地一清二楚

    原标题:这款神器,能把 Python 代码执行过程看地一清二楚 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 机器之心报道,参与:一鸣.杜伟 Python 是一门 ...

  9. python中函数提高代码执行速度吗_为什么Python代码在一个函数中运行得更快?

    匿名用户 除了局部/全局变量存储时间外,操作码预测使函数更快. 正如其他答案所解释的,该函数在循环中使用store_fast操作码.下面是函数循环的字节码:>> 13 FOR_ITER 6 ...

最新文章

  1. java 文件拷贝文件怎么打开_java如何拷贝文件
  2. curl 慢 不稳定_慢病毒包装步骤及注意事项
  3. 个人作业-Week2:案例分析
  4. Leecode 1218. 最长定差子序列——Leecode每日一题系列
  5. 联发科Helio P35处理器曝光:10GB运存
  6. jq查找字段忽略html标签,jQuery过滤HTML标签并高亮显示关键字的方法
  7. rsa 2048 java_使用SHA-256和RSA 2048进行加密和签名
  8. JavaScript中atEnd函数
  9. 一个网站的诞生- MagicDict开发总结1 [首页]
  10. Global Mapper居然也有手机版(附安装包下载)
  11. matlab hog函数个参数,hog算法的matlab
  12. 深度卷积神经网络(一)
  13. 腾讯测试岗位的面试题合集,请查收
  14. 华为鸿蒙系统卡顿怎么解决,为什么手机卡顿成系统难题?华为推出的鸿蒙系统有望解决...
  15. 题目 2291: [蓝桥杯][2018年第九届真题]调手表(BFS)
  16. 人生的思考——温水中被煮熟的程序员
  17. iOS开发之录屏时如何使系统录不到敏感信息
  18. cropperjs裁剪后图片变大的问题
  19. eap-peap/mschapv2
  20. Word Averaging模型做文本分类 稳定效果好模型简单

热门文章

  1. Wireshark分析实际报文理解SSL(TLS)协议
  2. kafka跨库同步mysql表_canal实时同步mysql表数据到Kafka
  3. 无我编程的10条诫律
  4. ubuntu设置开机启动程序
  5. 解决因蓝牙驱动版本问题无法升win10问题 (附 WIN7升级WIN10超详细步骤 及 升级后个别问题软件处理方法)
  6. linux常用命令操作
  7. Parasoft全面发布最广泛的MISRA规则覆盖
  8. 网络基础:ISO网络七层模型
  9. Easyexcel导入导出多个sheet
  10. PTA L1-020 帅到没朋友 (20 分)(C++)