Python 高效编程细节

之前参加比赛时我一直都使用C/C++但是最近觉得python写起了很方便,没有开头一大堆要声明的,也自带大数。所以最近在使用python刷leetcode,但是python的时间小效率没有C/C++可以转到汇编那么直接,所以总结了一些python刷题高效的写法心得,和大家分享。

先声明一下,程序运行时间受制于机器的使用环境,性能等多方面因素我测试配置与环境如下:

主要配置与环境说明
CPUAMD 2600X
内存16G 3000MHz
Python版本3.7
操作系统Windows 10

对没有时间看完全文的人做一个总结:

  1. 能用自带函数就不自己写;

  2. for循环比while效率更高;

  3. 熟练掌握map至关重要;

  4. 善于用[0]*100生成list;

  5. len()函数很耗时,如果有多层循环,建议先建一个变量把长度存起来;

  6. 可变长的数据不要用list存储,pop与append都很耗时间。

具体的实验结果如下:

一、判断条件:

使用while循环,对参数进行10000000次判断(代码见附录1),统计不同条件语句的耗时表格如下:

条件语句(部分)耗时
==1.0802428722381592
>=1.0002250671386719
not0.9622161388397217

可见条件语句的使用并不影响耗时。

二、for与while:

使用for循环与while循环计算累加(代码见附录2),结果for循环比while效率高很多,可见for循环更适合暴力求解:

forwhile
0.99522399902343751.8564159870147705

三、a+=b与a=a+b:

a+=b与a=a+b并无差别(代码见附录3):

a+=ba=a+b
1.00122427940368651.0522356033325195

四、pow与**:

pow与**并无差别(代码见附录4):

pow(a,b)a**b
2.14348030090332032.1334776878356934

五、*与for迭代生成全零list(代码见附录5):

差距非常大,所以千万不要使用for循环生成全零list!!!

[0 for _ in range(100000)][0]*100000
25.4559969902038573.616811752319336

六、map与for生成list:

目标是将['1'] * 10000000转为int型,map真的无敌,但是要注意map之后切勿再转list不然map的作用就没有了(代码见附录6)。

map转list纯mapfor迭代
1.40131449699401860.01.6323673725128174

七、len()函数的耗时:

for循环时常常需要使用list的长度这里使用几种不同的方式得到长度(代码见附录7),所以有多层循环时最好保存len_a重复使用:

len(a)len(a)保存len_a
1.37830948829650881.39731407165527340.5141160488128662

八、list.append() list+[]:

append稍微快一点,但是差不多(代码见附录8)。

.append()+[]
1.1822652816772461.3022921085357666

九、set,list,dict存与删除:

list的append的效率连dict都不如,我是没想到的(代码见附录9)list不适合用来存可变的数据。

 

 

listsetdict
2.995672702789301.806405544281001.9472553730010986

附录1:

import time
n = 0
s_time = time.time()
while True:
    if n == 10000000:
        break
    n += 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.0802428722381592
###############################
import time
n = 0
s_time = time.time()
while True:
    if n >= 10000000:
        break
    n += 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.0002250671386719
###############################
import time
n = 10000000
s_time = time.time()
while True:
    if not n:
        break
    n -= 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 0.9622161388397217

附录2:

import time

s_time = time.time()
tmp = 0
for i in range(10000000):
    tmp += i
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 0.9952239990234375
###############################
import time

s_time = time.time()
tmp = 0
i = 0
while i < 10000000:
    tmp += i
    i += 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.8564159870147705

附录3:

import time

s_time = time.time()
tmp = 0
for i in range(10000000):
    tmp += 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.0012242794036865
###############################
import time

s_time = time.time()
tmp = 0
for i in range(10000000):
    tmp = tmp + 1
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.0522356033325195

附录4:

import time

s_time = time.time()
for _ in range(10000):
    tmp = pow(2, 100000)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 2.1434803009033203
###############################
import time

s_time = time.time()
for _ in range(10000):
    tmp = 2 ** 100000
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 2.1334776878356934

附录5:

import time

s_time = time.time()
for _ in range(10000):
    a = [0] * 100000
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 3.616811752319336
###############################
import time

s_time = time.time()
for _ in range(10000):
    a = [0 for _ in range(100000)]
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 25.455996990203857

附录6:

import time

a = ['1'] * 10000000
s_time = time.time()
a = [int(i) for i in a]
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.6323673725128174
###############################
import time

a = ['1'] * 10000000
s_time = time.time()
a = list(map(int, a))
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.4013144969940186
###############################
import time

a = ['1'] * 10000000
s_time = time.time()
a = map(int, a)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 0.0

附录7:

import time

a = [0] * 10000000
s_time = time.time()
for _ in range(10000000):
    tmp = a.__len__()
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.3783094882965088
###############################
import time

a = [0] * 10000000
s_time = time.time()
for _ in range(10000000):
    tmp = len(a)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.3973140716552734
###############################
import time

a = [0] * 10000000
lem_a = len(a)
s_time = time.time()
for _ in range(10000000):
    tmp = lem_a
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 0.5141160488128662

附录8:

import time

a = []
s_time = time.time()
for _ in range(10000000):
    a.append(1)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.182265281677246
###############################
import time

a = []
b = [1]
s_time = time.time()
for _ in range(10000000):
    a += b
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.3022921085357666

附录9:

import time

a = []
s_time = time.time()
for _ in range(10000000):
    a.append(1)
    a.pop()
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 2.9956727027893066
###############################
import time

a = set()
s_time = time.time()
for _ in range(10000000):
    a.add(1)
    a.remove(1)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.8064055442810059
###############################
import time

a = {}
s_time = time.time()
for _ in range(10000000):
    a[0] = 1
    a.pop(0)
e_time = time.time()
print('#消耗时间:', e_time - s_time)
#消耗时间: 1.9472553730010986

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值