python代码技巧_让你python代码更快的3个小技巧

大家好!今天呢,我们来聊一聊如何加速你的 python 代码。

Python 语言的优点可以列举出许多,语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西,python 一个明显缺点就是运行速度慢,至少跟 C 语言没法比。

1c0afd1440b1f687fb6027251bbb3ce0.png

所以,不安于现状的 Pythoner 就开发了许多工具。其中,最著名的莫过于 Cython 和 Numba。其中 Cython 可以把 Python 代码转成 C 代码执行,而 Numba 则是 Python 中的一个 JIT 编译器(即时编译器),以此提高运行效率。

7288212719ac4ad6a102b2a244a22eb9.png

不过我们今天不讲这些复杂的工具,看看能不能只通过改进你的 Python 代码以提高速度。

一、函数

函数可以提高代码的可读性,那么用了函数对程序的执行效率是否有影响呢?我们来做个对比实验。

先来看一个不用函数的版本:

import math

import time

start = time.time() # 开始计时

lst = [] # 定义一个空列表

for i in range(1, 10000000):

lst.append(math.sqrt(i)) # 疯狂地往列表里添加计算结果

end = time.time() # 停止计时

print(end-start)

此代码在我的电脑上输出为 2.124 (不同配置的电脑结果不一样,可多次运行取平均值)。再来加上函数试一下:

import math

import time

def func():

lst = [] # 定义一个空列表

for i in range(1, 10000000):

lst.append(math.sqrt(i)) # 疯狂地往列表里添加计算结果

return lst # 返回结果

start = time.time() # 开始计时

lst = func()

end = time.time() # 停止计时

print(end-start)

在我的电脑上, 使用了函数的程序用了大概花了 1.743  秒。多次尝试,基本上都会比上一个版本节省 15~20% 左右时间,这个差距还是存在的。

有人可能会觉得,增加了 函数 调用,效率可能会低。但实际上,我们这里只是增加了一次调用,影响甚微。而由于  Python 中 局部变量 和 全局变量 的实现方式不同, 使用局部变量效率会高些。

所以使用函数不仅提高可读性,用得好还能让代码运行得更快。

二、去掉属性访问

再来看另一个例子,还是刚才的函数版本,我们做一点修改,改变其中导入函数的方式,由 math.sqrt 改为 sqrt:

from math import sqrt # 直接引用特定函数或属性

import time

def func():

lst = []

for i in range(1, 10000000):

lst.append(sqrt(i)) # 直接调用 sqrt

return lst

start = time.time()

lst = func()

end = time.time()

print(end-start)

在其它代码均没有变动的情况下,这个程序的输出时间变成了……

1.413 秒!

居然更快了。这又是为什么呢?

因为在进行 属性访问 的时候啊,会调用这个对象的 __getattribute__ 或者 __getattr__ 方法,造成了额外的开销,所以导致速度变慢。

三、列表推导式

最后再来看看 列表推导式(List Comprehension) ,它的效率和普通 for 循环会有不一样吗?

c4c001110be99314b3114df98de3d704.png

继续在上一个版本上修改:

from math import sqrt

import time

def func():

# for 循环改为列表推导式

lst = [sqrt(i) for i in range(1, 10000000)]

return lst

start = time.time()

lst = func()

end = time.time()

print(end-start)

结果是 0.968 秒!

这又是为什么呢?因为 列表推导式内的迭代是 C 实现 的,所以效率更高。

同最初的版本相比,实现同样的效果,我们仅通过调整代码的写法,速度就提高了一倍还多。

各位 Pythoner,你们学到了吗?

大家好!今天呢,我们来聊一聊如何加速你的 python 代码。

Python 语言的优点可以列举出许多,语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西,python 一个明显缺点就是运行速度慢,至少跟 C 语言没法比。

所以,不安于现状的 Pythoner 就开发了许多工具。其中,最著名的莫过于 Cython 和 Numba。其中 Cython 可以把 Python 代码转成 C 代码执行,而 Numba 则是 Python 中的一个 JIT 编译器(即时编译器),以此提高运行效率。

67e4c9d0f3134f97932b90fb0734b04e.png

不过我们今天不讲这些复杂的工具,看看能不能只通过改进你的 Python 代码以提高速度。

一、函数

函数可以提高代码的可读性,那么用了函数对程序的执行效率是否有影响呢?我们来做个对比实验。先来看一个不用函数的版本:

import mathimport timestart = time.time() # 开始计时lst = [] # 定义一个空列表for i in range(1, 10000000):lst.append(math.sqrt(i)) # 疯狂地往列表里添加计算结果end = time.time() # 停止计时print(end-start)

此代码在我的电脑上输出为2.124(不同配置的电脑结果不一样,可多次运行取平均值)。再来加上函数试一下:

import mathimport timedef func():lst = [] # 定义一个空列表for i in range(1, 10000000):lst.append(math.sqrt(i)) # 疯狂地往列表里添加计算结果return lst # 返回结果start = time.time() # 开始计时lst = func()end = time.time() # 停止计时print(end-start)

在我的电脑上,使用了函数的程序用了大概花了1.743秒。多次尝试,基本上都会比上一个版本节省 15~20% 左右时间,这个差距还是存在的。

有人可能会觉得,增加了函数调用,效率可能会低。但实际上,我们这里只是增加了一次调用,影响甚微。而由于Python 中局部变量和全局变量的实现方式不同,使用局部变量效率会高些。

所以使用函数不仅提高可读性,用得好还能让代码运行得更快。

二、去掉属性访问

再来看另一个例子,还是刚才的函数版本,我们做一点修改,改变其中导入函数的方式,由 math.sqrt 改为 sqrt:

from math import sqrt # 直接引用特定函数或属性import timedef func():lst = []for i in range(1, 10000000):lst.append(sqrt(i))    # 直接调用 sqrtreturn lststart = time.time()lst = func()end = time.time()print(end-start)

在其它代码均没有变动的情况下,这个程序的输出时间变成了……

1.413秒!

居然更快了。这又是为什么呢?

因为在进行属性访问的时候啊,会调用这个对象的 __getattribute__ 或者 __getattr__ 方法,造成了额外的开销,所以导致速度变慢。

三、列表推导式

最后再来看看列表推导式(List Comprehension),它的效率和普通 for 循环会有不一样吗?8e2e347da4bfeba256d346060ba62318.png继续在上一个版本上修改:

from math import sqrtimport timedef func():# for 循环改为列表推导式lst = [sqrt(i) for i in range(1, 10000000)]return lststart = time.time()lst = func()end = time.time()print(end-start)

结果是0.968秒!

这又是为什么呢?因为列表推导式内的迭代是 C 实现的,所以效率更高。

同最初的版本相比,实现同样的效果,我们仅通过调整代码的写法,速度就提高了一倍还多。各位 Pythoner,你们学到了吗?

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

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

相关文章

《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon

感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正!假设转载。请保留作者信息。 博客地址:http://blog.csdn.net/qq_21398167 原博文地址:http://blog.csdn.n…

python怎么打开一个窗口_python – 使按钮一次只打开一个窗口(通过关闭Toplevel窗口启用按钮)...

我希望NewWinButton一次只创建一个新窗口,这意味着如果if NewWin.winfo_exists() 1:NewWinButton.config(statedisabled)else:NewWinButton.config(statenormal)如果我在新窗口中添加一个按钮(本例中为QuitButton),我可以使这个工作:import tkinter as tkroot tk.…

从此走上一条iOS程序猿不归路。。。

新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的…

springboot mysql事物_在Spring Boot中使用数据库事务

关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了,其实不用猜,我们也知道Spring Boot在数据库事务处理问题上也给我们带来惊喜,OK,废话不多说&#…

什么是JSONP以及它是怎么产生的

什么是JSONP以及它是怎么产生的 1.什么是jsonp JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式…

cinder连接mysql数据库_Openstack入门篇(十六)之Cinder服务的部署与测试

1.理解块存储服务操作系统获得存储空间的方式一般有两种:通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)通过 NFS、CIFS 等 协议,mount 远程的文件系统第一种…

Mysql经常使用命令

1.导出整个数据库 mysqldump -u username -p --default-character-setlatin1 数据库名 > 导出的文件名称(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 mysqldump -u username -p 数据库名 表名> 导出的文件名称 mysqldump …

stack heap java_java中的Heap 和 Stack | 学步园

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与…

JavaScript密码复杂度

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title>密码复杂度</title></head><body><script type"text/javascript"> //密码复杂度var pwprompt("请输入密…

最后关于Pipeline完整的图如下:

最后关于Pipeline完整的图如下&#xff1a; 转载于:https://www.cnblogs.com/aaa6818162/p/5077988.html

amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7

场景近期在做微信开发时&#xff0c;需要获取用户发给公众服务号的语音留言。而从微信服务端下载来的语音格式却是amr的格式&#xff0c;同样的你手机录音、Android语音等也都是生成amr格式文件。但当你想在web页面去播放此文件时&#xff0c;就困难了。因为无论是当前HTML5的标…

input hidden用法

之前获取数据传数据&#xff0c;都是写在全局变量里&#xff0c;今天老板告诉我说用input hidden来存&#xff0c;我百度了一下&#xff0c;确实是个好方法&#xff0c;记录之&#xff1a; 1 隐藏域在页面中对于用户是不可见的&#xff0c;在表单中插入隐藏域的目的在于收集或发…

java 静态方法 多线程_Java静态方法的线程安全性问题

如果多个线程同时访问同一个静态方法&#xff0c;后一个线程传递的参数值会覆盖前一个线程传递的参数值吗&#xff1f;代码示例如下&#xff1a;被访问的静态资源&#xff1a;public class C {public static void test(String[] value) throws InterruptedException{Thread.sle…

dragloader.js帮助你在页面原生滚动下实现Pull Request操作

dragloader.js是一个面向移动Web开发的JavaScript库&#xff0c;帮助开发者在使用页面原生滚动时&#xff0c;模拟上/下拉手势&#xff0c;实现Pull Request操作。 在移动设备上&#xff0c;一般会使用 drag down 手势实现加载最新 使用 drag up 手势实现加载更多 dragloader样…

怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

我们都知道要运行Java代码就必须要有JRE&#xff0c;也就是Java运行时环境&#xff0c;JRE中包含了Java程序的必需组件&#xff0c;包括Java虚拟机以及Java核心类库&#xff0c;然而运行C代码则不需要额外的运行时环境&#xff0c;只需要把代码编译成CPU能识别的指令即可&#…

java 验证码 添加背景图_java登陆界面怎么加背景图 会的我加你

publicvoiduserInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭框架的同时结束程序this.setSize(500,300);//设置框架大小为长500,宽300this.setResizable(fa...public void userInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关…

【AJAX】AJAX实现搜索信息自己主动推荐并补全

好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完。我们在搜索引擎中输入文字时文本框下会提示对应的信息&#xff0c;这个案例就是实现这样的基本功能&#xff0c;代码比較粗糙还须要进一步完好&#xff0c;当中有些地方也须要向大神们请教一下。完毕效果截图&am…

n个骰子的点数 java_n个骰子的点数和为s的概率集合输出(Java)

问题描述&#xff1a;把n个骰子仍在地上&#xff0c;所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能出现的概率问题分析&#xff1a;这是一道应用动态规划思想的题目&#xff0c;而动态规划最难的就是要找最优子结构。并采取一种称为备忘录的方法避免重复计算。因为备…

2015的最后一天

今天是2015年的以后一天&#xff0c;3点半就要下班了。 也是我毕业&#xff0c;来到这家公司第5个月。 毕业后&#xff0c;去学习php&#xff0c;我喜欢这个&#xff0c;希望通过自己的努力给自己一个未来。 没什么可说的&#xff0c;加油吧&#xff0c;2016&#xff01;&#…

java se是不是java_Java SE和java EE究竟有什么实质上的区别

1、Java SE:Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) &#xff0c;用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库&#xff0c;同时&#xff0c;Java S…