提高python执行效率_提升Python程序运行效率的6个方法

Python是一个很酷的语言,因为你可以在很短的时间内利用很少的代码做很多事情。不仅如此,它还能轻松地支持多任务,比如多进程等。Python批评者有时会说Python执行缓慢。本文将尝试介绍6个技巧,可加速你的Python应用程序。

1.让关键代码依赖于外部包

虽然Python让许多编程任务变得容易,但它可能并不总能为紧急的任务提供最佳性能。你可以为紧急的任务使用C、C++或机器语言编写的外部包,这样可以提高应用程序的性能。这些包都是不能跨平台的,这意味着你需要根据你正在使用的平台,寻找合适的包。简而言之,这个方案放弃了一些应用程序的可移植性,以换取只有在特定主机上直接编程才能获得的程序性能。这里有一些你应该考虑加入到你的“性能兵工厂”的包:

这些包以不同的方式提高性能。例如,Pyrex能够扩展Python所能做的事情,例如使用C的数据类型来让内存任务更加有效或直接。PyInIne让你在Python应用程序中直接使用C代码。程序中的内联代码单独编译,但它在利用C语言所能提供的效率的同时,也让所有的代码都在同一个地方。

2.排序时使用键(key)

有很多老的Python排序代码,它们在你创建一个自定义的排序时花费你的时间,但在运行时确实能加速执行排序过程。元素排序的最好方法是尽可能使用键(key)和默认的sort()排序方法。例如,考虑下面的代码:

1

2

3

4

5

6

7

8

9

10

11

import operator

somelist= [(1,5,8), (6,2,4), (9,7,5)]

somelist.sort(key=operator.itemgetter(0))

somelist

#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]

somelist.sort(key=operator.itemgetter(1))

somelist

#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]

somelist.sort(key=operator.itemgetter(2))

somelist

#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],

每一个实例中,根据你选择的作为key参数部分的索引,数组进行了排序。类似于利用数字进行排序,这种方法同样适用于利用字符串排序。

3.优化循环

每种编程语言都会强调需要优化循环。当使用Python的时候,你可以依靠大量的技巧使得循环运行得更快。然而,开发者经常漏掉的一个方法是:避免在一个循环中使用点操作。例如,考虑下面的代码:

1

2

3

4

5

6

7

8

lowerlist= ['this','is','lowercase']

upper= str.upper

upperlist= []

append= upperlist.append

for wordin lowerlist:

append(upper(word))

print(upperlist)

#Output = ['THIS', 'IS', 'LOWERCASE']

每一次你调用方法str.upper,Python都会求该方法的值。然而,如果你用一个变量代替求得的值,值就变成了已知的,Python就可以更快地执行任务。优化循环的关键,是要减少Python在循环内部执行的工作量,因为Python原生的解释器在那种情况下,真的会减缓执行的速度。

(注意:优化循环的方法有很多,这只是其中的一个。例如,许多程序员都会说,列表推导是在循环中提高执行速度的最好方式。这里的关键是,优化循环是程序取得更高的执行速度的更好方式之一。)

4.使用较新版本的Python

在网上搜索Python信息,都会发现无数人在问,从Python一个版本迁移到另一个版本的问题的信息。一般来说,Python的每一个版本都包含了能让其比上个版本运行更快的优化。版本迁移的限制因素是,你喜欢的那些库是否已经迁移到Python的较新版本。相比于询问是否应该进行版本迁移,关键问题是确定一个新版本什么时候有足够的支持,以保证迁移的可行性。

你需要验证你的代码仍然运行。你需要在Python的新版本下使用你获得的新库,然后检查你的应用程序是否需要重大改变。只有在你作出必要的更正之后,你才会注意到版本之间的差别。然而,如果你正好确保你的应用程序能在新版本下运行,而不需要任何改变,你可能会错过那些版本升级带来的新特性。一旦你进行了迁移,你应该为你的新版本下的应用程序写一个说明,检查有问题的地方,并且优先考虑利用新版本的特性去更新那些地方。这样用户将会在升级的过程中更早的看到一个更大的性能提升。

5.尝试多种编码方法

如果每次你创建一个应用程序都是用相同的编码方法,几乎肯定会导致一些你的应用程序比它能够达到的运行效率慢的情况。作为分析过程的一部分,你可以尝试一些实验。例如,在一个字典中管理一些元素,你可以采用安全的方法确定元素是否已经存在并更新,或者你可以直接添加元素,然后作为异常处理该元素不存在情况。考虑第一个编码的例子:

1

2

3

4

5

6

7

8

n= 16

myDict= {}

for iin range(0, n):

char= 'abcd'[i%4]

if charnot in myDict:

myDict[char]= 0

myDict[char]+= 1

print(myDict)

这段代码通常会在myDict开始为空时运行得更快。然而,当mydict通常被数据填充(或者至少大部分被充填)时,另一种方法效果更好。

1

2

3

4

5

6

7

8

9

n= 16

myDict= {}

for iin range(0, n):

char= 'abcd'[i%4]

try:

myDict[char]+= 1

except KeyError:

myDict[char]= 1

print(myDict)

两种情况下具有相同的输出:{‘d': 4, ‘c': 4, ‘b': 4, ‘a': 4}。唯一的不同是这个输出是如何得到的。跳出固定的思维模式,创造新的编码技巧,能够帮助你利用你的应用程序获得更快的结果。

6.交叉编译应用程序

开发者有时会忘记,电脑实际上是不懂任何用于创建现代应用程序的语言,电脑所能懂得是机器代码。为了能在电脑上运行应用程序,你使用一个应用将人类可读的代码你转换成计算机能理解的。有时候用一种语言,比如Python,写一个应用,并用另一种语言,比如C++,运行它,从性能的角度来看是有意义的。这取决于你想要应用程序去做什么,以及主机系统可以提供的资源。

一个有趣的交叉编译器,Nuitka,可以将你的Python代码转换为C++代码。这么做的结果是,你可以在原生模式下执行应用程序,而不是依靠解释器。根据平台和任务,你可以看到一个显著的性能提升。

(注意:Nuitka目前还处于测试阶段,所以用它来产品程序时需要小心。实际上,目前最好将其用于实验。现在也有一些关于交叉编译是否是得到更好性能的最佳方式的讨论。开发者已经利用交叉编译好几年了,目的是实现特定的目标,比如更好的应用程序的速度。记住,每一个解决方案都会有得有失,你应该在将一个解决方案用于生产环境之前就好好考虑一下得失情况。)

在使用一个交叉编译器时,要确保它支持你使用的Python的版本。Nuitka支持Python2.6、2.7、3.2和3.3。想让这个方案发挥作用,你需要一个Python解释器和一个C++编译器。Nuitka支持多种C++编译器,包括Microsoft Visual Studio、MinGW 和 Clang/LLVM。

交叉编译也可能带来一些严重的负面影响。例如,当利用Nuitka工作时,你会发现即使一个小程序也能消耗很大的硬盘空间,这是因为Nuitka使用大量的动态链接库(DLLs)实现Python的功能。所以当你面对一个资源有限的系统时,这个方案可能不会很好的起作用。

总结

这六个技巧中的任意一个,都可以帮助你创造更快的Python程序。但任何技巧都不是万能的,不能每次都起作用。有些技巧在Python的特定版本下比其他技巧的更有效——甚至系统平台也能影响它们的效果。你需要配置你的应用,确定哪个地方让其运行缓慢,然后尝试似乎能最好的解决这些问题的一些技巧。

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

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

相关文章

听说容器正在吃掉整个软件世界?

过去几年,以 docker、kubernetes 为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图“放长线钓大鱼”。就说腾讯吧,目前基本所有业务都跑在云上&#xff0…

linux 短信功能,Android调用系统短信功能发送短信

Android调用系统短信功能发送短信有两种方法:第一种,设定发送的号码,和内容,界面没有联系人,群组组等按钮,如下图所示:代码如下:Uri smsToUri Uri.parse("smsto:114");// 联系人地址…

浅析 EF Core 5 中的 DbContextFactory

EF Core 5 中的 DbContextFactoryIntro使用过 EF Core 大多都会遇到这样一个场景,希望能够并行查询,但是如果使用同一个 DbContext 实例进行并行操作的时候就会遇到一个 InvalidOperationException 的异常,在 EF Core 2.x/3.x 版本中&#xf…

bcm943602cs蓝牙用不了_原来手机的蓝牙功能这么强大!除了连接耳机,还有这六大实用功能...

蓝牙是手机上的一个普通功能,基本上所有的手机里都有它,原先它的作用很有限,只是用来传输数据,但由于速度太慢,最后也是被软件所淘汰,慢慢的可以用来连接耳机,这也是博主用的比较多的一个功能&a…

c语言数字字母和字符串,C语言字符串用法之字符串和数字的转换

把字符串转换为数字1.考虑字符串除最后一个都是数字,如236\0int strToInt(const char *str){int temp 0;const char *ptr str; //ptr保存str字符串开头while(*str ! 0){temp temp * 10 (*str - 0);//根据ASCII码的数学关系把字符转换为数字str;}return temp;}2.…

数据结构——表达式求值(中序)

表达式求值(中序) 实验二 基于栈的中缀算术表达式求值 【实验目的】 1.掌握栈的基本操作算法的实现,包括栈初始化、进栈、出栈、取栈顶元素等。 2.掌握利用栈实现中缀表达式求值的算法。 【实验内容】 问题描述 输入一个中缀算术表达式,求解表达式的值。…

msdn画圆弧函数_画直线不简单!python-matplotlib告诉你为什么

1 说明:1.1 python的matplotlib画直线,看似简单,其实很难,从简单到复杂,逐步深入,小白秒懂。1.2 内容:画直线,画圆,画圆点,动画的单摆和圆套圆,好…

Wifi6网络

2020年是Wifi6设备全面爆发的一年,华为、小米、华硕、腾达、TP-LINK、360等多家厂商相继发布了Wifi6路由产品,掀起了一股更换路由器的热潮。首先,我们先来看几个常识1、Wifi6和IPv6两个没有必然联系,Wifi6是一种支持802.11ax的Wif…

c语言字符串中取最大字符串,使用C语言提取子字符串及判断对称子字符串最大长度...

先来看一个使用C语言从字符串中提取子字符串的基本方法总结:#include /*处理中文字符*//*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,获取字符串长度*/int StrLenU(const char* string){int len 0 ;const char* p st…

数据结构——用栈解决回文字符问题

回文 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否为回文。(提示:将一半字符入栈。) 所需的知识前提:栈 以下是顺序栈的基本算法 结构…

aspose excel中文文档_除了VBA,还有哪些编程语言可以操作Excel文件?

Excel(Microsoft office)是现在最常用的办公软件,主要涉及电子表格制作、数据处理、报表输出展示以及更高端的还有金融建模等;我们知道,在需要批处理多个Excel工作表以及工作簿的时候,需要用到一个自动化的利器:VBAVBA…

关于.NET5在IIS中部署的几个问题总结

本来我的系列教程已经慢慢剥离开IIS了,毕竟有了Docker容器以后,配合Nginx使用真的很不错。但是还是有很多同学使用IIS的,这个不可否认IIS的重要性。随着.NET的发布,很多小伙伴已经开始升级了,我也就陆陆续续收到了一些…

上海市二级c语言软件环境,上海市计算机二级C语言复习资料 word整理版.doc

上海市高等学校计算机等级考试二级(C程序设计)03年上海市高等学校计算机等级考试试卷二级 (C程序设计)(本试卷答卷时间为120分钟)试题一(28分,每小题4分)解答下列各小题,把正确的解答写在答卷纸的对应栏内。设有变量说明:int a5,b4,c3,r1,r2;…

数据结构——括号匹配问题

括号匹配 给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正…

wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!

如果你是一个企业主,你有建立企业官方网站的经验,在2-3年的运作中,我相信你至少修改了一个网站,甚至做了一个重大的SEO策略调整。当我们开始建立一个公司的时候,很多时候就是认为只要我们有一个公司的网站,…

c语言sizeof和strlen哪个大,C语言的sizeof和strlen区别与联系

sizeof指的是占有空间的大小&#xff0c;包括字符串结束的\0。strlen是计算字符串长度&#xff0c;以\0作为结束标志&#xff0c;并且\0不计入数值。#include #include using namespace std;void fun(char a[100]){cout << sizeof(a) << endl;// 参数里的数组也是按…

数据结构——进制转换(10—n)

进制转换&#xff08;10进制——n进制&#xff09; 所需知识&#xff1a;栈 #include<stdio.h> #include<bits/stdc.h> using namespace std; #include<malloc.h> #include<string>typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1…

Azure 静态 web 应用集成 Azure 函数 API

前几次我们演示了如何通过Azure静态web应用功能发布vue跟blazor的项目(使用 Azure静态web应用Github全自动部署VUE站点、使用Azure静态Web应用部署Blazor Webassembly应用)。但是一个真正的web应用&#xff0c;总是免不了需要后台api服务为前端提供数据或者处理数据的能力。同样…

c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

来源&#xff1a;网络&#xff0c;排版整理&#xff1a;晓宇微信公众号&#xff1a;芯片之家(ID&#xff1a;chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也叫结构。结构体和其他类型基础数据类型一样&#xff0c…

c语言next的用法,C语言strchr使用之Next查找和截断想要的字符串

#include #include #include #include #include #include #include #include static char pstring[] "Hello\n"; // 这里不能是char*int main(){char tmp ;char* pstr strchr(pstring,‘l‘);printf("pstr is %s %p\n",pstr,pstr);#if 0// 搜后面的pstr …