利用Cython发布python项目

最近有个python项目要发布,遇到了两个问题,一是项目在windows下运行有点慢,二是python都是脚本直接运行,没法保护代码安全。查了一下,有人说可以利用Cython,把python代码编译成为C++来调用。即能提高运行性能,又能实现对代码加密。我尝试做了一遍,果然成功的解决了上面两个问题,所以把过程记录下来。我是在windows 11的环境下操作的。
1、先安装Cython。直接执行命令pip install Cython就可以了。我安装的是0.29.20版本;
2、然后安装VS,可以直接去官网下载。我是从“软件管家”下载的2019版本,安装的时候只需要安装“C++生成工具”(注意:不同版本这个名字不太一样,只要包含后面两项就可以)下面的“MSVCv142 - VS2019 C++ x64/x86生成工具(v14...”和“Windows 10 SDK(10.0.17763.0)”这两项就行了;
3、新建一个目录,要处理的py文件放在里面。我这里创建了一个目录叫“TestPath”,然后放进去了一个我的python文件,名字叫做Demp.py。下面就是py文件的全部内容:
 

def Doing(content):ConArr = content.split(',')for c in ConArr:print(c)if __name__ == "__main__":Doing('A,B,C,A,A,A')

执行之后效果如下:
 

A
B
C
A
A
A

4、接下来在新创建的目录下新建一个pyx文件,把Demo.py文件里面的方法放进去。我这里创建的pyx文件名是fib.pyx,下面是pyx文件的全部内容:
 

def Doing(content):ConArr = content.split(',')for c in ConArr:print(c)

5、然后再创建一个设置用的py文件。我这里创建的设置文件是fib_setup.py,下面是设置文件的全部内容:
 

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_extsetup(cmdclass={'build_ext':build_ext},ext_modules=[Extension('myfib', ['fib.pyx'])])

其中fib.pyx就是第4步创建的pyx文件,而'myfib'就是咱们要生成的C++文件名,这个文件名要记住,后面咱们引用和调用的时候要用到;
6、到这里准备工作已经做完了,接下来要生成C++文件了。从cmd命令行进入到咱们在第3步创建的“TestPath”目录下,执行下面命令:
 

python fib_setup.py build_ext --inplace

如果执行结果显示“已完成代码的生成”,就说明执行成功了;
7、最后新写个py程序,调用新生成的C++文件就可以了。我这里创建了一个Test.py,内容如下:
 

import myfibif __name__ == "__main__":myfib.Doing('A,B,C,A,A,A')

其中myfib就是在第5步创建的C++文件名,调用的时候需要先引用然后再使用其中的方法。执行结果如下:
 

A
B
C
A
A
A

可以看到,执行结果和直接执行Demp.py是完全一样的;
8、至此python转C++已经完成。但是还要记得,把第4步中创建的pyx文件备份到别处,因为现在已经不需要python脚本了。
最后总结,完成上面操作后,我简单测试了一下,可以明显感觉到运行效率有提升,但是由于时间问题,没有仔细量化改善效果。感觉可能提高了20%左右,但是这个数据不严谨。另外针对不同的算法,提升效果也不太一样
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代,快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎,为我们提供了一种优秀的解决方案。除了传统的文本搜索,El…

linux上vim编辑器设置

linux上vim编辑器设置 减少tab缩进、显示行号等 在vimrc(一般在/etc/vim/vimrc中)末尾添加 set helplangcn "中文帮助文档(前提是下了中文包) syntax enable syntax on " 自动语法高亮 set number"显示行号 colorscheme desert" 设…

【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管动态显示(五)

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发…

Java-API简析_java.util.HashTable<K, V>类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/132522445 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

http和https的区别?

什么是 HTTP? HTTP是一种互联网数据传输协议,用于在网络服务器和客户端之间进行数据传输。作为万维网的基础,HTTP协议允许网络浏览器向网络服务器发送请求,服务器则会返回响应。HTTP协议基于文本,因此传输的数据是人类…

41.岛屿数量(第四期模拟笔试)(BFS练习题)

题目: 给定一个 m 行 n 列的二维地图,初始化每个单元格都是海洋,二维地图外也全是海洋。 操作 addLand 会将单元格(col, row)变为陆地。 定义一系列相连的被海洋包围的陆地为岛屿, 横向相邻或者纵向相连的…

多线程下的signal信号处理

多线程中,信号在哪个线程中处理是不确定的,可能被任意一个线程处理 下边的代码可以验证该结论,多次Ctrlc,会被不同的线程捕获此信号,并处理,最终每个线程死锁,阻塞在等待锁的状态 #include &l…

微信小程序请求接口返回的二维码(图片),本地工具和真机测试都能显示,上线之后不显示问题

请求后端接口返回的图片&#xff1a; 页面展示&#xff1a; 代码实现&#xff1a; :show-menu-by-longpress"true" 是长按保存图片 base64Code 是转为base64的地址 <image class"code" :src"base64Code" alt"" :show-menu-by-long…

2023-09-02力扣每日一题

链接&#xff1a; 2511. 最多可以摧毁的敌人城堡数目 题意和解&#xff1a; 阅读理解题&#xff0c;要从1到-1或-1到1&#xff0c;中间只能有0&#xff0c;求最多能有多少0 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; int captureForts(vect…

C#--sugarClient使用之ColumnName

使用Sugar ORM框架可以很方便地实现表名和实体名的映射&#xff0c;可以按照以下步骤进行操作&#xff1a; 创建一个实体类&#xff0c;定义实体的属性及其他信息。 [SugarTable("user_info")] // 指定实体对应的表名 public class User {public int Id { get; set…

Three.js实现模型,模型材质可拖拽效果 DragControls

Three.js提供了一个拖拽的API DragControls 用于实现模型材质拖拽效果 DragControls&#xff1a;是一个用于在Three.js中实现拖拽控制的辅助类。它简化了在Three.js中实现拖拽物体的过程。 DragControls的构造函数接受三个参数&#xff1a; objects&#xff1a;一个包含需要…

java中用HSSFWorkbook生成xls格式的excel(亲测)

SXSSFWorkbook类是用于生成XLSX格式的Excel文件&#xff08;基于XML格式&#xff09;&#xff0c;而不是XLS格式的Excel文件&#xff08;基于二进制格式&#xff09;。 如果你需要生成XLS格式的Excel文件&#xff0c;可以使用HSSFWorkbook类。以下是一个简单的示例&#xff1a…

C# textBox 右键菜单 contextMenuStrip

需求&#xff1a; 想在上图空白处可以右键弹出菜单&#xff0c;该怎么做呢&#xff1f; 1.首先&#xff0c;拖出一个 ContextMenuStrip。 随便放哪里都行&#xff0c;如下: 2.在textBox里关联这个“右键控件”即可&#xff0c;如下&#xff1a; 最终效果如下&#xff1a; 以上…

HTML <th> 标签

实例 普通的 HTML 表格,包含两行两列: <table border="1"><tr><th>Company</th><th>Address</th></tr><tr><td>Apple, Inc.</td><td>1 Infinite Loop Cupertino, CA 95014</td></tr…

自定义类型:结构体、枚举、联合

目录 结构体 结构体的基础知识 结构的声明 特殊的声明 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体&#xff08;共…

算法题打卡day51-股票问题 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票含冷冻期 状态&#xff1a;Debug后AC 需要添加一个冷冻期状态和一个表示冷冻期状态的今天卖出不持有状态。代码如下&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int len prices.size();vector<vector<int&g…

编写中间件以用于 Express 应用程序

概述 中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。 中间件函数可以执行以下任务&#xff1a; 执行任何代码。对请求和响应对象进行更改。结束请求/响应循环。调用堆…

thinkphp 使用 easypay 和 easywechat

easypay 是3.x easywechat 是6.x 引入&#xff1a; use Yansongda\Pay\Pay;//easypayuse EasyWeChat\MiniApp\Application as MiniApp;//easywechat use EasyWeChat\Pay\Application as Payapp;//easywechat public function suborder(){$order [out_trade_no > time(…

JS 常用方法汇总

本篇目录 Math字符串数组JSON日期(Date)字符数字URL其他 Math Math.max()&#xff1a;用于返回指定参数中的最大值。Math.min()&#xff1a;用于返回指定参数中的最小值。Math.random()&#xff1a;用于生成一个介于 0 到 1 之间的随机数。Math.floor()&#xff1a;用于将一个…

Zabbix Api监控项值推送:zabbix_sender

用法示例&#xff1a; zabbix_sender [-v] -z server [-p port] [-I IP-address] [-t timeout] -s host -k key -o value其中&#xff1a; -z 即 --zabbix-server&#xff0c;Zabbix server的主机名或IP地址。如果主机由proxy监控&#xff0c;则应使用proxy的主机名或IP地址-…