简介

目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们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加速技巧的更多相关文章

  1. 2018年要学习的10大Python Web框架

    通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...

  2. 10大Python开源项目推荐(Github平均star2135)

    翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...

  3. 关于Python的10大实用编程技巧

      Python 是一种通用的脚本开发语言,比其他编程语言更加简单.易学,其面向对象特性甚至比Java.C#..NET更加彻底,因此非常适合快速开发. Python 已经成为最受欢迎的程序设计语言之一 ...

  4. 能够让你装逼的10个Python小技巧

      列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这 ...

  5. 10 大 python 库

    TensorFlow Scikit-Learn Numpy Keras PyTorch LightGBM Eli5 SciPy Theano Pandas 简介 python 是最流行和使用最广泛的编 ...

  6. 兵贵神速!掌握这10个Python技巧,让你代码工作如鱼得水

    主题 Python 1000个读者心中有1000个哈姆雷特,要问1000个程序员“什么才是最好的语言”,Java.Python.PHP.C++ 也都有自己的位置.但要问编程语言流行指数之王非,那真的非 ...

  7. 人们对Python在企业级开发中的10大误解

    From : 人们对Python在企业级开发中的10大误解 在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Bra ...

  8. 快速开发 jQuery 插件的 10 大技巧(转)

    1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...

  9. 程序员心髓:移动应用API设计10大技巧

    移动App与基于Web/云服务发生对话是很常见的事情,最简单的可能仅仅只是检索数据,但也可能包含发送数据.用户授权和管理.而这也就验证了为移动应用建立API的重要性,为此,我们特总结了10大移动API ...

随机推荐

  1. SeataAT模式原理

    Seata架构 Seata将分布式事务理解为一个全局事务,它由若干个分支事务组成,一个分支事务就是一个满足ACID的本地事务. Seata架构中有三个角色: TC (Transaction Coord ...

  2. 『忘了再学』Shell基础 — 22、主要的环境变量配置文件说明

    目录 1.source命令 2.Linux系统中环境变量配置文件 (1)登录时生效的环境变量配置文件 (2)/etc/profile环境变量配置文件 (3)/etc/profile.d/*.sh环境变 ...

  3. css设置元素背景透明度的2种方式

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月9日. 设置元素的背景的透明度可以使用2种方式:方式1:opacity属性.方式2:使用rgba值.两种方式有一点差异,opaci ...

  4. JS:String

    String数据类型:字符串 字符串是存储字符的变量. 字符串可以是引号中(可以使用单引号或双引号)的任意文本. var a = "abc"; var b = "123& ...

  5. C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML

    C/C++/QT界面开发界面美化视频课程系列 课程1   C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML 返回顶部 课程1   C语言 C++1X STL QT免费视 ...

  6. 记一次grpc server内存/吞吐量优化

    背景 最近,上线的采集器忽然时有OOM.采集器本质上是一个grpc服务,网络设备通过grpc协议将数据上报后,采集器进行格式等整理后,发往下一个系统(比如分析,存储). 打开运行环境,发现特性如下: ...

  7. 谷歌浏览器控制台 f12怎么设置成中文/英文 切换方法,一定要看到最后!!!

    1.打开谷歌浏览器 2.右键选择检查或 f12 打开控制台 3.点击控制台右边的设置 4.中切英 选择偏好设置->语言=>English 5.英切中 6.选择中文 7.重启 8.切换中文成 ...

  8. VirtualBox虚拟机安装Ubuntu系统后,增加内存空间和处理器核心数

    对于Linux爱好者而言,初次使用虚拟机时,一般都会使用默认的设置,例如硬盘空间.内存空间等等. 而往往在熟悉之后,安装了某些必要的软件,或者熟悉了实际的开发场景后,却发现原本给虚拟机分配的物理资源是 ...

  9. Linux用户、组 管理

    Linux安全模型 3A: Authentication:认证,验证用户身份 Authorization:授权,不同的用户设置不同权限 Accouting|Audition:审计 Linux用户: 管 ...

  10. java获取本地json格式的内容

    前言 该功能模块基于springBoot,自己在开发中遇到相关功能开发,总结如写: 1.首先将所需要获取的json文件放在项目resource目录下: 2.所需要的pom依赖: <depende ...