python 桌面应用 启动缓慢_如何加快Python 应用的启动时间

我听说pipenv9.0.2已经发布,启动时间有了很大的改进。

我很快就试了一下,但我觉得并不快。所以我用Python3.7的新特性来研究它。

在本文中,我将介绍该特性以及如何使用它。

启动时间≒导入时间

例如,pipenv -h 的执行时间比显示帮助消息的时间长得多。

一般来说,当应用程序启动时,会有一些启动过程,比如加载环境变量或配置文件。

对于Python应用程序,导入模块占用了大部分启动时间。例如,pipenv --version 花费了大约800ms,而import pipenv 花费了700ms。

显示模块的导入时间

Python 3.7有新的特性来显示导入模块的时间。

这个特性是通过 -X importtime 选项或 PYTHONPROFILEIMPORTTIM 环境变量来启用的。

例如,您可以利用以下命令来测试pipenv的导入时间:

这里是一个pipenv --version输出结果的例子 。

研究导入时间

在输出的最后面,你会看到这些行:

在最后一行,579479表示 import pipenv 需要579479us。

在导入pipenv的同时,还导入了许多其他模块。从上面的示例中,您可以看到 pipenv 导入了pipenv.cli。子导入以2个空格缩进。

再看最后一行。507表示运行pipenv模块时只需要507us。579479-507=578972us用于子导入。

找出缓慢的部分

我们来从输出中找到缓慢子树。我选取了几行。

pkg_resources

如您所见,导入pkg_resources 很缓慢。

但令人惊讶的是,pkg_resources没有进行缩进;它不是pipenv的子导入。

这意味着pkg_resources是由pipenv脚本而不是模块导入的。

坏消息: 导入pkg_resources很慢。这是一个已知的问题,在不破坏向后兼容性的情况下很难修复。

好消息: 您可以避免导入pkg_resources!

在安装了wheel之后,pip会对它进行构建并从构建包进行安装。

从wheel (.whl)和源码包(.tar.gz)安装是不同的过程。

从wheel安装时,脚本中不使用pkg_resources:

IPython

看下面的部分.

pipenv导入dotenv, dotenv再导入 dotenv.ipython,它再导入IPython。

这就是为什么pipenv在我的环境中开始很慢; 我已经安装了IPython。

但是为什么要导入IPython呢?我阅读了dotenv源码,发现它是用于IPython扩展的。

当然,pipenv和许多dotenv用户并不使用IPython扩展。

我向dotenv提交了一个推送请求,建议dotenv根据需要导入IPython。

由于pipenv有自己的dotenv副本,所以我向pipenv提交了完全删除dotenv.ipython的推送请求。

结论

我可以将 pipenv--version 的时间从800ms减少到500ms。

导入时间分析是研究和优化应用程序启动时间的好方法。

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

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

相关文章

python单词首字母大写_在Python中将每个单词的首字母大写

python单词首字母大写Here, we are implementing a python program to capitalizes the first letter of each word in a string. 在这里,我们正在实现一个python程序来大写字符串中每个单词的首字母。 Example: 例: Input: "HELLO WORLD!"O…

matlab中求模最大,matlab求取模极大值时出错

本帖最后由 Nate_ 于 2016-4-17 15:57 编辑points1024 时,有波形输出,但信号有5438个点。改为5438就不行。主程序:%小波模极大值重构是采用的交替投影法close all;points5438; level4; sr360; num_inter6; wfdb4;%所处理数据的…

stl向量_如何检查C ++ STL中向量中是否存在元素?

stl向量Given a vector and an element to be searched in the vector. 给定一个向量和要在向量中搜索的元素。 To check whether an elements exists in a vector or not – we use find() function. find() function takes 3 arguments. 要检查向量中是否存在元素 –我们使用…

java socket如何请求485协议_javaSE第十五部分 网络编程(1)Socket和ServerSocket

网络编程基础知识C/S结构:全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。两种架构各…

【分享】linux下u盘使用

2019独角兽企业重金招聘Python工程师标准>>> linux下u盘使用 方案一: Linux不像Windows一样,接上新硬件后可以自动识别,在Linux下无法自动识别新硬件的,需要手动去识别。USB移动存储设备通常被识别为sda1,…

kotlin中判断字符串_Kotlin程序删除字符串中所有出现的字符

kotlin中判断字符串Given a string and a character, we have to remove all occurrences of the character in given string. 给定一个字符串和一个字符,我们必须删除给定字符串中所有出现的字符。 Example: 例: Input:string "includeHelp Del…

Java9中使用jpa,jpa – eclipselink在Java 9上使用final字段进行静态编织

我有一些JPA注释字段,如下所示:Column(name "SOME_FIELD", updatable false, nullable false)private final String someField;当实体插入数据库时​​,这些字段存储在数据库中.它们无法进一步更新.对于Java编程语言,可以将这些字段视为final.使用Ecli…

python语言程序设计及医学应用_Python语言程序设计(高等学校计算机专业规划教材)...

第1章Python语言概述/1 1.1Python语言的发展1 1.1.1Python的起源1 1.1.2Python的发展2 1.2Python语言的特点2 1.2.1Python的特性2 1.2.2Python的缺点4 1.2.3Python与其他语言的比较5 1.3简单的Python程序介绍5 1.4Python的程序开发工具8 1.4.1Python的版本选择8 1.4.2Python的安…

swift 3.0 中使用 xib

文章写于2016年9月底,Xcode 8,swift 3.0真是蛋疼,折腾了很长时间,试了网上很多教程,结果又莫名的可以了! 1.方法和OC中一样 将一个xib文件和一个ViewController类进行关联的几步操作: command &…

数字图像处理图像反转的实现_使用8086微处理器反转16位数字

数字图像处理图像反转的实现Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to reverse 16 bit number using 8 bits operation. 在8086微处理器中编写汇编语言程序,以使用8位操作反转16位数字。 Example: …

php猴子找大王算法,教程方法;php实现猴子选大王问题算法实例电脑技巧-琪琪词资源网...

琪琪词资源网-教程方法;php实现猴子选大王问题算法实例电脑技巧,以下是给大家带来的教程方法;php实现猴子选大王问题算法实例,大家可以了解一下哦!下面为你介绍php实现猴子选大王问题算法实例。本文实例讲述了php实现猴子选大王问题算法。分享给大家供大…

numpy 归一化_NumPy 数据归一化、可视化

仅使用 NumPy,下载数据,归一化,使用 seaborn 展示数据分布。下载数据import numpy as npurl https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.datawid np.genfromtxt(url, delimiter,, dtypefloat, usecols[1])仅提取…

java虚拟机规范阅读(三)异常

Java虚拟机里面的异常使用Throwable或其子类的实例来表示,抛异常的本质实际上是程序控制权的一种即时的、非局部(Nonlocal)的转换——从异常抛出的地方转换至处理异常的地方。绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的&am…

puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件

puppeteer apiWe will continue using Node.js and puppeteer which is a node library. As we saw in our last article, Puppeteer is a Node library developed by Google and provides a high-level API for developers. 我们将继续使用Node.js和puppeteer(这是一个节点库)…

python线程同步锁_[python] 线程间同步之Lock RLock

为什么需要同步 同样举之前的例子,两个线程分别对同一个全局变量进行加减,得不到预期结果,代码如下: total 0 def add(): global total for i in range(1000000): total 1 def desc(): global total for i in range(1000000): t…

servlet的由来

2019独角兽企业重金招聘Python工程师标准>>> 动静态网页技术 首先说下访问网页的大概过程: 你在浏览器中输入网址,按下enter键,此时浏览器代你做了很多事,简要说为:将你输入的这个网址作为目的地参数&#…

php header 文件大小,php获取远程文件大小及信息的函数(head_php

php获取远程文件大小及信息的函数(header头信息获取)阿里西西Alixixi.com开发团队在做一个客户系统时,需要做远程下载的功能,并实时显示进度条效果。所以,需要预先读取远程文件的大小信息,然后做为实时下载进度条的参数。功能函数…

Java ObjectInputStream readUnsignedShort()方法(带示例)

ObjectInputStream类readUnsignedShort()方法 (ObjectInputStream Class readUnsignedShort() method) readUnsignedShort() method is available in java.io package. readUnsignedShort()方法在java.io包中可用。 readUnsignedShort() method is used to read 2 bytes (i.e. …

python中info的用法_Python pandas.DataFrame.info函数方法的使用

DataFrame.info(self, verboseNone, bufNone, max_colsNone, memory_usageNone, null_countsNone) [source] 打印DataFrame的简要摘要。 此方法显示有关DataFrame的信息,包括索引dtype和列dtype,非空值和内存使用情况。 参数:verbose &#x…

第四次作业 孙保平034 李路平029

用C编写一个学生成绩管理系统 1、可以实现以下功能&#xff1a; cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl; 2、用链表存储信息 * 程序头部的注释结束 3、约定的规范&#xff1a; 1界面设计简介&#xff0c;人性化…