简介

目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们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. Codeforces Round #793 (Div. 2)

    C. LIS or Reverse LIS? D. Circular Spanning Tree E. Unordered Swaps F MCMF?

  2. mysql外键创建不成功/失效

    当前mysql版本:SELECT VERSION();结果为:5.5.40. 在复习mysql外键约束时创建表格:stu与grade,目标:grade的id随着student的id级联更新,且限制删除 ...

  3. 《C Primer Plus》第六版笔记--1~3章

    目录 第一章 初识C语言 1 使用C语言的7个步骤 1.1 定义程序目标 1.2 设计程序(功能实现) 1.3 编写代码 1.4 编译 1.5 运行程序 1.6 测试和调试程序 1.7 维护和修改代码 ...

  4. Navicat 连接 MySQL

    目录 简述 新建连接 常见错误 简述 Navicat 是一套快速.可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本.Navicat 图形界面直观,提供简便的管理方法,设计和操作 MyS ...

  5. 写Selenium代码时一些技巧

    本文地址: https://www.cnblogs.com/hchengmx/p/10880002.html 1. Chrome插件之"CSS Selector Helper for Chr ...

  6. 论文解读(MGAE)《MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs》

    论文信息 论文标题:MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs论文作者:Qiaoyu Tan, Ninghao L ...

  7. web自动化之元素定位篇

    一.web自动化元素定位的方式有8种.------腾讯课堂 1.1 id定位: 1.2 class定位: 1.3 classname定位 1.4 tag_name 1.5

  8. React技巧之循环遍历对象

    原文链接:https://bobbyhadz.com/blog/react-loop-through-object 作者:Borislav Hadzhiev 正文从这开始~ 遍历对象的键 在React ...

  9. go语言学习笔记-初识Go语言

    Go语言是怎样诞生的? Go语言的创始人有三位,分别是图灵奖获得者.C语法联合发明人.Unix之父肯·汤普森(Ken Thompson).Plan 9操作系统领导者.UTF-8编码的最初设计者罗伯·派 ...

  10. Vue3 项目实战

    使用Vue3 开发一个小米商城 业务流程 登录---> 产品首页--->产品站--->产品详情 购物车--->订单确认--->订单支付--->订单列表 业务开发流程 ...