python性能优化(1)

列表操作

列表相加 < append < 列表推到式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import timeit

def way1(max1):
mylist = []
for i in range(max1):
mylist.append(i*i)

def way2(max1):
mylist = [i*i for i in range(max1)]

def way3(max1):
mylist = []
for i in range(max1):
mylist = mylist + [i*i]

if __name__ == '__main__':
t1 = timeit.Timer("way1(10000)","from __main__ import way1")
t2 = timeit.Timer("way2(10000)","from __main__ import way2")
t3 = timeit.Timer("way3(10000)","from __main__ import way3")
print(t1.timeit(number=1000)) # 3.6928262000000003
print(t2.timeit(number=1000)) # 3.6928262000000003
print(t3.timeit(number=1000)) # 118.5624449

搜索成员时

set比list快。 列表O(n), 集合O(1).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import timeit

def way1(max1):
mylist = [i*i for i in range(max1)]
n = 0
for i in range(10000):
if i in mylist:
n += 1
else:
n += i*2
return n


def way2(max1):
myset = {i*i for i in range(max1)}
n = 0
for i in range(10000):
if i in myset:
n += 1
else:
n += i*2
return n

if __name__ == '__main__':
t1 = timeit.Timer("way1(1000)","from __main__ import way1")
t2 = timeit.Timer("way2(1000)","from __main__ import way2")
print(t1.timeit(number=10)) # 1.479847
print(t2.timeit(number=10)) # 0.056411800000000234

if 放在 for循环外面

巧用 try/except

神器 collection