首页 > 编程语言 >10大python加速技巧

10大python加速技巧

时间:2022-08-14 12:23:21浏览次数:85  
标签:10 技巧 python times %% ms time total CPU

简介

目前非常多的数据竞赛都是提交代码的竞赛,而且加入了时间的限制,这就对于我们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,times,%%,ms,time,total,CPU
From: https://www.cnblogs.com/ranxi169/p/16585192.html

相关文章

  • win10自带杀毒永久关闭步骤(彻底禁用defender方法)
    win10自带杀毒永久关闭步骤(彻底禁用defender方法)「终身受用」-生活小妙招网(jsxyy.com.cn)    ......
  • Python的分子模拟动态促进DF Theory理论对二进制硬盘系统的适用性
    全文链接:http://tecdat.cn/?p=27993 原文出处:拓端数据部落公众号作者:LawrenceXi这是一个偏学术的项目。流体力学界对过冷液体(supercooledliquid)的认知还不完善,我的......
  • day 10 事件上
    事件(上)概述:事件是一个流程,就是一个监听(预备)一个触发(当前内容执行了(进行处理)用户在页面上操作(监听这个操作),然后我们要调用函数来处理(进行处理).监听过程----触发过......
  • python基础之open函数和路径处理
    前言本次内容主要介绍文件处理open函数以及路径处理。一、open函数根据前面介绍的函数调用方式,调用open函数。#open函数调用open()TypeError:open()miss......
  • Qt开发经验小技巧236-240
    关于在头文件中定义函数使用static关键字的血的教训。有时候我们需要将一些常用函数写在一个文件中供很多地方调用,如果写的是intdoxxx{}这种,在你多个地方引用的时候......
  • 1070 结绳——25分
    给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串......
  • 1069 微博转发抽奖——20分
    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包。请你编写程序帮助他确定中奖名单。输入格式:输入第一行给出三个正整数M......
  • 用python进行统计分析(2)
    其他描述性统计量#方差np.var(df["wt"])#标准差np.std(df["wt"])#众数stats.mode(df["wt"])#偏度stats.skew(df["wt"])#峰度stats.kurtosis(df["wt"])#正态......
  • 1067 试密码——20分
    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。输入格式:输入在第一行给出一个密码(长度......
  • 1068 万绿丛中一点红——20分
    对于计算机而言,颜色不过是像素点对应的一个24位的数值。现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围8个相......