nuitka和pyinstaller打包文件大小对比

news2024/11/19 4:40:08

最近看到一篇文章,介绍nuitka打包Python程序:比较PyInstaller和Nuitka

听说Nuitka打包文件会获得更小的文件体积,我准备测试一下。

1、用两种方式打包程序

写一个简单的wxPython程序:

# demo.py

import wx

app = wx.App()
frame = wx.Frame(None, -1, 'Test Window')
frame.Center()
frame.Show()
app.MainLoop()

写一个批处理,完成依赖安装,并使用单文件单文件夹两种模式打包:

@echo off

set PY=py -3.6-32 -m

:: install requirements
%PY% pip install wxpython==4.0.0
%PY% pip install pyinstaller
%PY% pip install nuitka

:: build by pyinstaller
%PY% PyInstaller --onefile demo.py
%PY% PyInstaller --onedir demo.py

:: build by nuitka
%PY% nuitka --onefile demo.py
%PY% nuitka --standalone demo.py

pyinstaller和nuitka的运行时间分别为10秒和36秒,nuitka的编译速度确实慢了很多。

nuitka打包Python程序

2、测试结果对比

打包文件大小对比:

打包方法pyinstallernuitka
onefile8.75 MB21.00 MB
onefile+zip8.62 MB7.30 MB
onefile+upx8.66 MB6.45 MB
onedir22.10 MB20.90 MB
onedir+zip9.31 MB7.25 MB

对比多文件模式打包的文件结构差异(左侧pyinstaller/右侧nuitka):

文件结构对比
对比两边的文件夹,发现内容非常一致,有很多一样的dll。

我把所有在右侧(nuitka)中未出现的dll在左侧(pyinstaller)中删除,发现程序仍能正常运行。推测可能是pyinstaller的自动包导入分析器有差异,导入了很多未用到的dll。

唯一的区别是pyinstaller中的 “base_library.zip” 文件不能删除。

删完 “无用dll” 之后,pyinstaller的文件夹版大小变成了19.00 MB,还是nuitka更大。。

汇总表格:

打包方法nuitkapyinstallerpyinstaller+删除多余dll
onefile21.00 MB8.75 MB-
onefile+zip7.30 MB8.62 MB-
onefile+upx6.45 MB8.66 MB-
onedir20.90 MB22.10 MB19.00 MB
onedir+zip7.25 MB9.31 MB7.86 MB

3、最终结论

  1. 使用nuitka打包是pyinstaller所用时间的3.6倍,显著慢于pyinstaller,但是仍然在有限的时间内可以完成。
  2. 在不使用upx压缩时,nuitka打包出来的单一文件体积更大。在应用upx压缩后,nuitka略小于pyinstaller。
  3. 对比发现,nuitka打包的依赖文件更少,推测可能是pyinstaller的依赖包分析不全面导致的,将未使用到的包也包含了进去。
  4. 将pyinstaller多文件打包中 “多余的” 文件(“base_library.zip” 除外)删除后,程序仍能正常运行,并且总体积略小于nuitka的版本。
  5. 使用pyinstaller进行多文件模式打包,可以参照nuitka多文件模式打包中的文件结构,删除pyinstaller中的不必要依赖文件(“base_library.zip” 除外),可以得到更小的文件体积。

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

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

相关文章

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境:conda activate env_name 接着使用:conda env list查看目标env的位置 如D:\anacon…

有关字符串算法

例题一 解法: 算法思路(两两⽐较): 我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。 例题二 解法(中⼼扩散&am…

Android Studio学习8——点击事件

在xml代码中绑定 在java代码中绑定 弹出一个toast 随机,数组

Linux: linux常见操作指令

目录 01.ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要) 06.rmdir指令 && rm 指令(重要) 07.man指令(重要) 07.cp指令(重要) 08.mv指令&#…

stargan项目实战及源码解读

数据及代码链接见文末 ​​​​​​​论文解析:Star GAN论文解析-CSDN博客 1.测试模块效果与实验分析 测试数据需要准备两个文件夹src(源)和ref(目标),这两个文件夹下的文件夹名称代表各个domain。 运行测…

【随笔】Git 高级篇 -- 撤销变更(十四)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

基于单片机便携式太阳能充电器系统设计

**单片机设计介绍,基于单片机便携式太阳能充电器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机便携式太阳能充电器系统设计概要主要涉及利用单片机作为核心控制器件,结合太阳能充电技术和便携式…

java-网络编程socket-聊天室-先导

这边我会简单介绍一下聊天室的组成部分,和思路的引导 涉及知识点 java 中异常处理机制 和 io流和网络编程socket 简单回顾异常机制 Java中的异常机制是一种用于处理程序运行期间出现的错误或异常情况的机制。这种机制允许程序员定义在特定情况下可能发生的错误,并…

Revit 2025新功能一览~

Hello大家好!我是九哥~ Revit2025已经更新,安装后,简单试了下,还是挺不错的,流畅度啊,新功能啊,看来还是有听取用户意见的,接下来就简单看看都有哪些新功能。 好了,今天的…

小红书自动化仿写发文机器人了解一下

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

CCIE-08-BGP-Listen

目录 实验条件网络拓朴实验目的 开始配置配置动态路由协议配置BGP检查邻居配置 实验条件 网络拓朴 实验目的 将R1配置成Listen状态,自动接收来自其它路由器的建邻居请求、建立邻居 开始配置 配置动态路由协议 这里用EIGRP来配置,保证网络的可达性&a…

2024年华为OD机试真题-推荐多样性-Java-OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从…

ES11 学习

文章目录 1. Promise.allSettled2. Module 新增2.1 ! 动态导入 import()2.2 import.meta2.3 export * as obj from module 3. 字符串 matchAll()4. BigInt实际开发相关使用 5. globalThis6. 空值合并运算符7. 可选链操作符 1. Promise.allSettled Promise.allSettled() 返回一个…

应急响应实战笔记05Linux实战篇(2)

第2篇:捕捉短连接 0x00 前言 ​ 短连接(short connnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接…

Azure service tag 导致的Exchange online 无法发送邮件的问题

最近碰到一个比较有趣的客户问题。 这个客户一直在使用Exchange online 与自己在Azure Vnet 里面的exchange server交换邮件。 客户的网络架构如下图所示。 客户说之前从exchange online往外发邮件一直是好的,但是最近两周开始只有百分之3左右的邮件可以发出去,其他的都pen…

C语言中的结构体:高级特性与扩展应用

前言 结构体在C语言中的应用不仅限于基本的定义和使用,还包含一些高级特性和扩展应用,这些特性和应用使得结构体在编程中发挥着更加重要的作用。 一、位字段(Bit-fields) 在结构体中,我们可以使用位字段来定义成员…

【性能测试】接口测试各知识第2篇:学习目标,1. 理解接口的概念【附代码文档】

接口测试完整教程(附代码资料)主要内容讲述:接口测试,学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标,RESTFUL1. 理解接口的概念,2.什么是接口测试…

mybatis流式游标查询-导出DB大数据量查询OOM问题

问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a.result.ResultsetRowsCursor:游标查询,将结果集分批拉取到内存&…

Windows集群部署项目

目录 一,环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二,部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一,环境准备 1.1.安装MySQL 可以参考博客:http://t.csdnimg.cn/A75bg 1.2.…

我为什么会选择Vim来开发Go项目及Vim IDE安装配置和操作

你好,我是孔令飞,字节跳动云原生资深研发、前腾讯云原生技术专家。《企业级 Go 项目开发实战》、《从零开发企业级 Go 应用》作者,欢迎加入 孔令飞的云原生实战营,助你进阶 Go 云原生高级开发工程师。 作为一名 Golang 开发&…