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 ...
随机推荐
- 广义SAM
参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串. 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树. ...
- SQL中如何修改数据库名、表名、列名?
文章目录 1.SQL中如何修改数据库的名字? 2.SQL中如何修改表的名字? 3.SQL中如何修改列的名字? 4.SQL中如何修改列的数据类型?(未完成,待续) 1.SQL中如何修改数据库名? 语法 ...
- DAST 黑盒漏洞扫描器 第二篇:规则篇
0X01 前言 怎么衡量一个扫描器的好坏,扫描覆盖率高.扫描快.扫描过程安全 而最直接的效果就是扫描覆盖率高(扫的全) 怎么扫描全面,1 流量全面 2 规则漏报低 流量方面上篇已经讲过,这篇主要讲扫描 ...
- android系统常见问题类型
android系统中常见的异常问题,包括上层应用.框架.内核.驱动等,一般来说有如下一些异常问题类型: ANR,Answer No Response,应用无响应. FC,Force Close,强制退 ...
- 分享一款自带工作流引擎的NodeJS全栈框架,接单快手、创业神器
CabloyJS是什么 CabloyJS是一款自带工作流引擎的Node.js全栈框架, 接单快手.创业神器, 基于koa + egg + vue + framework7 + mysql 在线演示 场 ...
- systemctl设置程序开机启动、关闭、启用/禁用服务以vsftpd为例
参考:https://blog.csdn.net/qq_29663071/article/details/80814081 systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前se ...
- 3D大场景展示功能你了解多少?见详解!
裸眼3D技术的出现打破了真实与虚拟的界限,人们不仅希望能够体验奇妙的虚拟场景,也希望足不出户在短短几分钟内就能看到遍布各地的场景,希望能实时对接关键数据. 裸眼3D技术的出现打破了真实与虚拟的界限,人 ...
- 10道不得不会的JavaEE面试题
10道不得不会的 JavaEE 面试题 我是 JavaPub,专注于面试.副业,技术人的成长记录. 以下是 JavaEE 面试题,相信大家都会有种及眼熟又陌生的感觉.看过可能在短暂的面试后又马上忘记了 ...
- HashMap存储自定义类型键值和LinkedHashMap集合
HashMap存储自定义类型键值 1.当给HashMap中存放自定义对象时,如果自定义对象是键存在,保证键唯一,必须复写对象的hashCode和equals方法. 2.如果要保证map中存放的key和 ...
- Eolink 全局搜索介绍【翻译】
随着前后端分离成为互联网项目开发的标准模式, API 成为了前后端联通的桥梁.而面对越来越频繁和复杂的调用需求,项目里的 API 数量也越来越多,我们需要通过搜索功能来快速定位到对应的 API来进行使 ...