之前参加比赛时我一直都使用C/C++但是最近觉得python写起了很方便,没有开头一大堆要声明的,也自带大数。所以最近在使用python刷leetcode,但是python的时间小效率没有C/C++可以转到汇编那么直接,所以总结了一些python刷题高效的写法心得,和大家分享。
先声明一下,程序运行时间受制于机器的使用环境,性能等多方面因素我测试配置与环境如下:
主要配置与环境 | 说明 |
CPU | AMD 2600X |
内存 | 16G 3000MHz |
Python版本 | 3.7 |
操作系统 | Windows 10 |
对没有时间看完全文的人做一个总结:
-
能用自带函数就不自己写;
-
for循环比while效率更高;
-
熟练掌握map至关重要;
-
善于用[0]*100生成list;
-
len()函数很耗时,如果有多层循环,建议先建一个变量把长度存起来;
-
可变长的数据不要用list存储,pop与append都很耗时间。
具体的实验结果如下:
一、判断条件:
使用while循环,对参数进行10000000次判断(代码见附录1),统计不同条件语句的耗时表格如下:
条件语句(部分) | 耗时 |
== | 1.0802428722381592 |
>= | 1.0002250671386719 |
not | 0.9622161388397217 |
可见条件语句的使用并不影响耗时。
二、for与while:
使用for循环与while循环计算累加(代码见附录2),结果for循环比while效率高很多,可见for循环更适合暴力求解:
for | while |
0.9952239990234375 | 1.8564159870147705 |
三、a+=b与a=a+b:
a+=b与a=a+b并无差别(代码见附录3):
a+=b | a=a+b |
1.0012242794036865 | 1.0522356033325195 |
四、pow与**:
pow与**并无差别(代码见附录4):
pow(a,b) | a**b |
2.1434803009033203 | 2.1334776878356934 |
五、*与for迭代生成全零list(代码见附录5):
差距非常大,所以千万不要使用for循环生成全零list!!!
[0 for _ in range(100000)] | [0]*100000 |
25.455996990203857 | 3.616811752319336 |
六、map与for生成list:
目标是将['1'] * 10000000转为int型,map真的无敌,但是要注意map之后切勿再转list不然map的作用就没有了(代码见附录6)。
map转list | 纯map | for迭代 |
1.4013144969940186 | 0.0 | 1.6323673725128174 |
七、len()函数的耗时:
for循环时常常需要使用list的长度这里使用几种不同的方式得到长度(代码见附录7),所以有多层循环时最好保存len_a重复使用:
len(a) | len(a) | 保存len_a |
1.3783094882965088 | 1.3973140716552734 | 0.5141160488128662 |
八、list.append() list+[]:
append稍微快一点,但是差不多(代码见附录8)。
.append() | +[] |
1.182265281677246 | 1.3022921085357666 |
九、set,list,dict存与删除:
list的append的效率连dict都不如,我是没想到的(代码见附录9)list不适合用来存可变的数据。
list | set | dict |
2.99567270278930 | 1.80640554428100 | 1.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