10大python加速技巧
简介
目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们python代码的加速非常重要。本篇文章我们介绍在Python中加速代码的一些技巧。可能不是很多,但在一些大的循环或者函数调用时则能带来巨大的帮助。
十大Python加速技巧,首先导入numpy
import numpy as np
1 List Comprehension
将for的append操作替换为列表中直接产出。这其中加速的主要原因是:
- 在循环的每次迭代中我们都需要调用append,然后在循环的每次迭代中将其作为函数调用。
%%time
numbers = []
for x in range(10000000):
if x % 2 == 0:
numbers.append(x**2)
CPU times: user 2.33 s, sys: 81.6 ms, total: 2.41 s
Wall time: 2.43 s
%%time
numbers = [x**2 for x in range(10000000) if x % 2 == 0]
CPU times: user 1.89 s, sys: 93.8 ms, total: 1.99 s
Wall time: 2 s
2 使用built-in函数
python中非常多自带的函数采用了较多的加速,有些是使用C进行了加速。所以会比我们自己写一些for函数等快很多
%%time
def builtin_sum():
return sum(range(100000000))
_ = builtin_sum()
*CPU times: user 1.74 s, sys: 18.8 ms, total: 1.75 s*
*Wall time: 1.78 s*
%%time
def loop_sum():
s = 0
for i in range(100000000):
s += 1
return s
_ = loop_sum()
*CPU times: user 5.44 s, sys: 24.9 ms, total: 5.47 s*
*Wall time: 5.51 s*
3 尽可能不调用函数
在所有的函数语言中,对于函数的调用都是相对更加耗时的,所以在能不适用函数调用的时候尽可能不调用函数,虽然这会使我们的代码更佳简洁易读。
%%time
def square(num):
return num**2
squares = []
for i in range(1000000):
squares.append(square(i))
CPU times: user 421 ms, sys: 23.7 ms, total: 445 ms
Wall time: 452 ms*
%%time
def squares():
squares = []
for i in range(1000000):
squares.append(i**2)
return squares
_ = squares()
CPU times: user 329 ms, sys: 19.5 ms, total: 348 ms
Wall time: 358 ms
4 尽可能使用numpy对数据进行加速
因为numpy是使用C语言进行过加速的,所以相对于其它很多数据操作是更加快速的。
%%time
python_list = [i for i in range(1000000)]
_ = [i**2 for i in python_list]
CPU times: user 333 ms, sys: 42.7 ms, total: 376 ms
Wall time: 383 ms
%%time
numpy_array = np.array([i for i in range(1000000)])
_ = np.square(numpy_array)
CPU times: user 124 ms, sys: 29.7 ms, total: 153 ms
Wall time: 155 ms
5 numpy >= built-in
%%time
def numpy_sum():
return np.sum(np.arange(0,10000000))
_ =numpy_sum()
CPU times: user 27.1 ms, sys: 10.7 ms, total: 37.8 ms
Wall time: 37.1 ms
%%time
def builtin_sum():
return sum(range(10000000))
_ = builtin_sum()
CPU times: user 169 ms, sys: 1.17 ms, total: 170 ms
Wall time: 170 ms
6 避免Global Variables
Python中的全局变量不是最好的选择。
- 通常使用局部变量能更好地跟踪位置和内存使用情况。除了内存使用之外,Python在检索局部变量方面也比全局变量略快。
因此,在可能的情况下,最好避免使用全局变量。
7 处理字符串尽可能使用字符串自带的函数
在处理字符串的时候尽可能使用字符串自带的函数,往往是针对性的优化过,会比我们调用一些其它的工具包来处理特定的数据类型要快很多。
from collections import Counter
sequence = "AGAGKTAGAT" * 10000000
%%time
def count_string(seq):
return [seq.count("A"), seq.count('G'), seq.count('T'), seq.count('K')]
_ = count_string(sequence)
CPU times: user 293 ms, sys: 2.73 ms, total: 296 ms
Wall time: 296 ms
%%time
def count_Counter(seq):
counter = Counter(seq)
return [counter["A"], counter["G"], counter["T"], counter["K"]]
_ = count_Counter(sequence)
CPU times: user 4.25 s, sys: 30.1 ms, total: 4.28 s
Wall time: 4.36 s
8 使用多个变量一起赋值
%%time
a = 2
b = 3
c = 5
d = 7
CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs
Wall time: 6.91 µs
%%time
a, b, c, d = 2, 3, 5, 7
CPU times: user 3 µs, sys: 1e+03 ns, total: 4 µs
Wall time: 5.25 µs
9 while 1取代while True
%%time
cnt = 0
while 1:
cnt += 1
if cnt >= 100000:
break
CPU times: user 11.1 ms, sys: 699 µs, total: 11.8 ms
Wall time: 12.6 ms
%%time
cnt = 0
while True:
cnt += 1
if cnt >= 100000:
break
CPU times: user 12.8 ms, sys: 365 µs, total: 13.1 ms
Wall time: 14.2 ms
10 使用最新的python工具包
一般后续的新的工具包往往比过往的python工具包要快很多,所以能更新到新的板块则可以尽快更新。
原创作者:孤飞-博客园
原文链接:https://www.cnblogs.com/ranxi169/p/16585192.html
10大python加速技巧的更多相关文章
- 2018年要学习的10大Python Web框架
通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...
- 10大Python开源项目推荐(Github平均star2135)
翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...
- 关于Python的10大实用编程技巧
Python 是一种通用的脚本开发语言,比其他编程语言更加简单.易学,其面向对象特性甚至比Java.C#..NET更加彻底,因此非常适合快速开发. Python 已经成为最受欢迎的程序设计语言之一 ...
- 能够让你装逼的10个Python小技巧
列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这 ...
- 10 大 python 库
TensorFlow Scikit-Learn Numpy Keras PyTorch LightGBM Eli5 SciPy Theano Pandas 简介 python 是最流行和使用最广泛的编 ...
- 兵贵神速!掌握这10个Python技巧,让你代码工作如鱼得水
主题 Python 1000个读者心中有1000个哈姆雷特,要问1000个程序员“什么才是最好的语言”,Java.Python.PHP.C++ 也都有自己的位置.但要问编程语言流行指数之王非,那真的非 ...
- 人们对Python在企业级开发中的10大误解
From : 人们对Python在企业级开发中的10大误解 在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Bra ...
- 快速开发 jQuery 插件的 10 大技巧(转)
1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...
- 程序员心髓:移动应用API设计10大技巧
移动App与基于Web/云服务发生对话是很常见的事情,最简单的可能仅仅只是检索数据,但也可能包含发送数据.用户授权和管理.而这也就验证了为移动应用建立API的重要性,为此,我们特总结了10大移动API ...
随机推荐
- 充电log关键词
充电LOG 1.healthd 2.暗码log 1.healthd healthd:battery l=96 v=4378 t=20.0 h=2 st=3 c=55 fc=4709000 cc=15 ...
- Java使用FreeMarker模版技术动态生成word实践
一.序言 在日常开发中,常常有动态word文件生成的需求,通过编制模版,然后动态修改word内容以组合成新的文件.报告单.请假单.发票页等都可以使用动态生成word来解决. 笔者总结归纳出通用技术要点 ...
- 【Srping】事务的执行原理(一)
在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理. @Enab ...
- electron-vue 项目启动动态获取配置文件中的后端服务地址
前言 最近的项目迭代中新增一个需求,需要在electron-vue 项目打包之后,启动exe 可执行程序的时候,动态获取配置文件中的 baseUrl 作为服务端的地址.electron 可以使用 no ...
- Sublime Text 新建代码片段(图解)
新建代码片段 1.打开NEW Snippet- 2.编辑代码片段 3.设置快捷键,按tab键执行 更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_4451949 ...
- labelimg使用指南
labelimg使用指南 From RSMX - https://www.cnblogs.com/rsmx/ 目录 labelimg使用指南 1. 确保已经安装了 Python 环境 2. 使用pip ...
- Linux操作系统(5):网络命令
Linux 网络环境配置①自动获取 缺点: linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样.这个不适用于做服务器,因为我们的服务器的 ip 需要时固定的. ②直 接 修 ...
- HTML 超文本标记语言 (Hyper Text Markup Language)
1.HTML是什么 HTML指的超文本标记语言(Hyper Text Markup Language),是一种用来描述网页的语言.超文本指的是除了可以包含文字之外,还可以包含图片.链接.音乐.视频.程 ...
- 编译安装Python出现“pip is configured with locations that require TLS/SSL, however the ssl.....”
ubuntu: sudo apt-get install libssl-dev Cenos: sudo yum install openssl-devel 重新编译: ./configure --en ...
- Spring Data JPA 在 @Query 中使用投影的方法
Spring Data JPA 在 @Query 中使用投影的方法 关于投影的基本使用可以参考这篇文章:https://www.baeldung.com/spring-data-jpa-project ...