昨天来源:伯乐在线
注:个人学习记录用。建议大家看原文,原文对比更加清晰,一目了然。
注:各位要使用这些技巧的话,请在自己的服务器上测试一遍,并且加大测试的数值,目前的用例都是 10 W 次,我们可以测试 100 W , 1000 W 次。。。。
注:如果测试的性能相差不多,请以可读性为主。平台运行测试的平台环境:
>>> import sys>>> import platform>>> platform.system'linux'>>> platform.release'3.11.0-19-generic'>>> sys.version'2.7.5+ (default, Feb 27 2014, 19:37:08) [GCC 4.8.1]'>>> from timeit import timeit>>> from dis import dis>>>import sys
import platform
platform.system
'Linux'
platform.release
'3.11.0-19-generic'
sys.version
'2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1]'from timeit import timeit
from dis import dis
以下的代码主要是使用了 timeit 函数测试处理时间,以及使用 dis 函数显示详细的处理步骤(汇编的方式),能让你清楚的知道,慢在哪里?为什么慢?
测试用例 1更快的方式:
def a:d = {}return d>>> >>> timeit(a, number=1000000)... 0.0905051231384>>> >>> dis(a)5 0 BUILD_MAP 03 STORE_FAST 0 (d)6 6 LOAD_FAST 0 (d)9 RETURN_VALUE >>>
timeit(anumber=1000000)
...0.0905051231384
dis(a)
5 0BUILD_MAP 0
3STORE_FAST 0(d)
def a:d = dictreturn d>>> >>> timeit(a, number=1000000)... 0.206549167633>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (dict)3 CALL_FUNCTION 06 STORE_FAST 0 (d)6 9 LOAD_FAST 0 (d)12 RETURN_VALUE >>>
d=dict
...0.206549167633
dis(a)
5 0LOAD_GLOBAL 0(dict)
3CALL_FUNCTION 0
6STORE_FAST 0(d)
测试用例 2更快的方式:
def a:l = [0, 8, 6, 4, 2, 1, 3, 5, 7, 9]l.sortreturn l>>> >>> timeit(a, number=1000000)... 0.53688287735>>> >>> dis(a)5 0 LOAD_CONST 1 (0)3 LOAD_CONST 2 (8)6 LOAD_CONST 3 (6)9 LOAD_CONST 4 (4)12 LOAD_CONST 5 (2)15 LOAD_CONST 6 (1)18 LOAD_CONST 7 (3)21 LOAD_CONST 8 (5)24 LOAD_CONST 9 (7)27 LOAD_CONST 10 (9)30 BUILD_LIST 1033 STORE_FAST 0 (l)6 36 LOAD_FAST 0 (l)39 LOAD_ATTR 0 (sort)42 CALL_FUNCTION 045 POP_TOP 7 46 LOAD_FAST 0 (l)49 RETURN_VALUE >>>l.sort
returnl
...0.53688287735
dis(a)
5 0LOAD_CONST 1(0)
3LOAD_CONST 2(8)
6LOAD_CONST 3(6)
9LOAD_CONST 4(4)
12LOAD_CONST 5(2)
15LOAD_CONST 6(1)
18LOAD_CONST 7(3)
21LOAD_CONST 8(5)
24LOAD_CONST 9(7)
27LOAD_CONST 10(9)
30BUILD_LIST 10
33STORE_FAST 0(l)
6 36LOAD_FAST 0(l)
39LOAD_ATTR 0(sort)
42CALL_FUNCTION 0
45POP_TOP
49RETURN_VALUE
def a:l = [0, 8, 6, 4, 2, 1, 3, 5, 7, 9]return sorted(l)>>> >>> timeit(a, number=1000000)... 0.781757831573>>> >>> dis(a)5 0 LOAD_CONST 1 (0)3 LOAD_CONST 2 (8)6 LOAD_CONST 3 (6)9 LOAD_CONST 4 (4)12 LOAD_CONST 5 (2)15 LOAD_CONST 6 (1)18 LOAD_CONST 7 (3)21 LOAD_CONST 8 (5)24 LOAD_CONST 9 (7)27 LOAD_CONST 10 (9)30 BUILD_LIST 1033 STORE_FAST 0 (l)6 36 LOAD_GLOBAL 0 (sorted)39 LOAD_FAST 0 (l)42 CALL_FUNCTION 145 RETURN_VALUE >>>returnsorted(l)
...0.781757831573
dis(a)
6 36LOAD_GLOBAL 0(sorted)
39LOAD_FAST 0(l)
42CALL_FUNCTION 1
45RETURN_VALUE
测试用例 3更快的方式:
def a:a, b, c, d, e, f, g, h, i, j = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9return j, i, h, g, f, e, d, c, b, a>>> >>> timeit(a, number=1000000)... 0.216089963913>>> >>> dis(a)5 0 LOAD_CONST 11 ((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))3 UNPACK_SEQUENCE 106 STORE_FAST 0 (a)9 STORE_FAST 1 (b)12 STORE_FAST 2 (c)15 STORE_FAST 3 (d)18 STORE_FAST 4 (e)21 STORE_FAST 5 (f)24 STORE_FAST 6 (g)27 STORE_FAST 7 (h)30 STORE_FAST 8 (i)33 STORE_FAST 9 (j)6 36 LOAD_FAST 9 (j)39 LOAD_FAST 8 (i)42 LOAD_FAST 7 (h)45 LOAD_FAST 6 (g)48 LOAD_FAST 5 (f)51 LOAD_FAST 4 (e)54 LOAD_FAST 3 (d)57 LOAD_FAST 2 (c)60 LOAD_FAST 1 (b)63 LOAD_FAST 0 (a)66 BUILD_TUPLE 1069 RETURN_VALUE >>>
abcdefghij=0123456789
returnjihgfedcba
...0.216089963913
dis(a)
5 0LOAD_CONST 11((0123456789))
3UNPACK_SEQUENCE 10
6STORE_FAST 0(a)
9STORE_FAST 1(b)
12STORE_FAST 2(c)
15STORE_FAST 3(d)
18STORE_FAST 4(e)
21STORE_FAST 5(f)
24STORE_FAST 6(g)
27STORE_FAST 7(h)
30STORE_FAST 8(i)
33STORE_FAST 9(j)
39LOAD_FAST 8(i)
42LOAD_FAST 7(h)
45LOAD_FAST 6(g)
48LOAD_FAST 5(f)
51LOAD_FAST 4(e)
54LOAD_FAST 3(d)
57LOAD_FAST 2(c)
60LOAD_FAST 1(b)
63LOAD_FAST 0(a)
66BUILD_TUPLE 10
69RETURN_VALUE
def a:a = 0b = 1c = 2d = 3e = 4f = 5g = 6h = 7i = 8j = 9return j, i, h, g, f, e, d, c, b, a>>> >>> timeit(a, number=1000000)... 0.249029874802>>> >>> dis(a)5 0 LOAD_CONST 1 (0)3 STORE_FAST 0 (a)6 6 LOAD_CONST 2 (1)9 STORE_FAST 1 (b)7 12 LOAD_CONST 3 (2)15 STORE_FAST 2 (c)8 18 LOAD_CONST 4 (3)21 STORE_FAST 3 (d)9 24 LOAD_CONST 5 (4)27 STORE_FAST 4 (e)10 30 LOAD_CONST 6 (5)33 STORE_FAST 5 (f)11 36 LOAD_CONST 7 (6)39 STORE_FAST 6 (g)12 42 LOAD_CONST 8 (7)45 STORE_FAST 7 (h)13 48 LOAD_CONST 9 (8)51 STORE_FAST 8 (i)14 54 LOAD_CONST 10 (9)57 STORE_FAST 9 (j)15 60 LOAD_FAST 9 (j)63 LOAD_FAST 8 (i)66 LOAD_FAST 7 (h)69 LOAD_FAST 6 (g)72 LOAD_FAST 5 (f)75 LOAD_FAST 4 (e)78 LOAD_FAST 3 (d)81 LOAD_FAST 2 (c)84 LOAD_FAST 1 (b)87 LOAD_FAST 0 (a)90 BUILD_TUPLE 1093 RETURN_VALUE >>>
a=0
b=1
c=2
d=3
e=4
f=5
g=6
h=7
i=8
j=9
...0.249029874802
dis(a)
3STORE_FAST 0(a)
6 6LOAD_CONST 2(1)
9STORE_FAST 1(b)
7 12LOAD_CONST 3(2)
15STORE_FAST 2(c)
8 18LOAD_CONST 4(3)
21STORE_FAST 3(d)
9 24LOAD_CONST 5(4)
27STORE_FAST 4(e)
10 30LOAD_CONST 6(5)
33STORE_FAST 5(f)
11 36LOAD_CONST 7(6)
39STORE_FAST 6(g)
12 42LOAD_CONST 8(7)
45STORE_FAST 7(h)
13 48LOAD_CONST 9(8)
51STORE_FAST 8(i)
14 54LOAD_CONST 10(9)
57STORE_FAST 9(j)
15 60LOAD_FAST 9(j)
63LOAD_FAST 8(i)
66LOAD_FAST 7(h)
69LOAD_FAST 6(g)
72LOAD_FAST 5(f)
75LOAD_FAST 4(e)
78LOAD_FAST 3(d)
81LOAD_FAST 2(c)
84LOAD_FAST 1(b)
87LOAD_FAST 0(a)
90BUILD_TUPLE 10
93RETURN_VALUE
测试用例 4更快的方式:
def a:a, b, c, d, e, f = 2, 5, 52, 25, 225, 552if a < b and b < c and c < d and d < e and e < f:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.176034927368>>> >>> dis(a)5 0 LOAD_CONST 7 ((2, 5, 52, 25, 225, 552))3 UNPACK_SEQUENCE 66 STORE_FAST 0 (a)9 STORE_FAST 1 (b)12 STORE_FAST 2 (c)15 STORE_FAST 3 (d)18 STORE_FAST 4 (e)21 STORE_FAST 5 (f)6 24 LOAD_FAST 0 (a)27 LOAD_FAST 1 (b)30 COMPARE_OP 0 (<)33 POP_JUMP_IF_FALSE 8836 LOAD_FAST 1 (b)39 LOAD_FAST 2 (c)42 COMPARE_OP 0 (<)45 POP_JUMP_IF_FALSE 8848 LOAD_FAST 2 (c)51 LOAD_FAST 3 (d)54 COMPARE_OP 0 (<)57 POP_JUMP_IF_FALSE 8860 LOAD_FAST 3 (d)63 LOAD_FAST 4 (e)66 COMPARE_OP 0 (<)69 POP_JUMP_IF_FALSE 8872 LOAD_FAST 4 (e)75 LOAD_FAST 5 (f)78 COMPARE_OP 0 (<)81 POP_JUMP_IF_FALSE 887 84 LOAD_GLOBAL 0 (True)87 RETURN_VALUE 8 >> 88 LOAD_GLOBAL 1 (False)91 RETURN_VALUE >>>
ifa<bandb<candc<dandd<eande<f:
returnTrue
returnFalse
...0.176034927368
dis(a)
5 0LOAD_CONST 7((255225225552))
3UNPACK_SEQUENCE 6
6STORE_FAST 0(a)
9STORE_FAST 1(b)
12STORE_FAST 2(c)
15STORE_FAST 3(d)
18STORE_FAST 4(e)
21STORE_FAST 5(f)
6 24LOAD_FAST 0(a)
27LOAD_FAST 1(b)
30COMPARE_OP 0(<)
33POP_JUMP_IF_FALSE 88
36LOAD_FAST 1(b)
39LOAD_FAST 2(c)
42COMPARE_OP 0(<)
45POP_JUMP_IF_FALSE 88
48LOAD_FAST 2(c)
51LOAD_FAST 3(d)
54COMPARE_OP 0(<)
57POP_JUMP_IF_FALSE 88
60LOAD_FAST 3(d)
63LOAD_FAST 4(e)
66COMPARE_OP 0(<)
69POP_JUMP_IF_FALSE 88
72LOAD_FAST 4(e)
75LOAD_FAST 5(f)
78COMPARE_OP 0(<)
81POP_JUMP_IF_FALSE 88
7 84LOAD_GLOBAL 0(True)
87RETURN_VALUE
91RETURN_VALUE
更慢的方式:
def a:a, b, c, d, e, f = 2, 5, 52, 25, 225, 552if a < b < c < d < e < f:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.208202123642>>> >>> dis(a)5 0 LOAD_CONST 7 ((2, 5, 52, 25, 225, 552))3 UNPACK_SEQUENCE 66 STORE_FAST 0 (a)9 STORE_FAST 1 (b)12 STORE_FAST 2 (c)15 STORE_FAST 3 (d)18 STORE_FAST 4 (e)21 STORE_FAST 5 (f)6 24 LOAD_FAST 0 (a)27 LOAD_FAST 1 (b)30 DUP_TOP 31 ROT_THREE 32 COMPARE_OP 0 (<)35 JUMP_IF_FALSE_OR_POP 8038 LOAD_FAST 2 (c)41 DUP_TOP 42 ROT_THREE 43 COMPARE_OP 0 (<)46 JUMP_IF_FALSE_OR_POP 8049 LOAD_FAST 3 (d)52 DUP_TOP 53 ROT_THREE 54 COMPARE_OP 0 (<)57 JUMP_IF_FALSE_OR_POP 8060 LOAD_FAST 4 (e)63 DUP_TOP 64 ROT_THREE 65 COMPARE_OP 0 (<)68 JUMP_IF_FALSE_OR_POP 8071 LOAD_FAST 5 (f)74 COMPARE_OP 0 (<)77 JUMP_FORWARD 2 (to 82)>> 80 ROT_TWO 81 POP_TOP >> 82 POP_JUMP_IF_FALSE 897 85 LOAD_GLOBAL 0 (True)88 RETURN_VALUE 8 >> 89 LOAD_GLOBAL 1 (False)92 RETURN_VALUE >>>
ifa<b<c<d<e<f:
...0.208202123642
dis(a)
27LOAD_FAST 1(b)
30DUP_TOP
31ROT_THREE
32COMPARE_OP 0(<)
35JUMP_IF_FALSE_OR_POP 80
38LOAD_FAST 2(c)
41DUP_TOP
42ROT_THREE
43COMPARE_OP 0(<)
46JUMP_IF_FALSE_OR_POP 80
49LOAD_FAST 3(d)
52DUP_TOP
53ROT_THREE
54COMPARE_OP 0(<)
57JUMP_IF_FALSE_OR_POP 80
60LOAD_FAST 4(e)
63DUP_TOP
64ROT_THREE
65COMPARE_OP 0(<)
68JUMP_IF_FALSE_OR_POP 80
71LOAD_FAST 5(f)
74COMPARE_OP 0(<)
77JUMP_FORWARD 2(to82)
80ROT_TWO
81POP_TOP
82POP_JUMP_IF_FALSE 89
7 85LOAD_GLOBAL 0(True)
88RETURN_VALUE
8 89LOAD_GLOBAL 1(False)
92RETURN_VALUE
测试用例 5更快的方式:
def a:a = Trueif a:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.109908103943>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (True)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 POP_JUMP_IF_FALSE 167 12 LOAD_GLOBAL 0 (True)15 RETURN_VALUE 8 >> 16 LOAD_GLOBAL 1 (False)19 RETURN_VALUE >>>
...0.109908103943
dis(a)
5 0LOAD_GLOBAL 0(True)
6 6LOAD_FAST 0(a)
9POP_JUMP_IF_FALSE 16
7 12LOAD_GLOBAL 0(True)
15RETURN_VALUE
19RETURN_VALUE
def a:a = Trueif a is True:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.141321897507>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (True)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 LOAD_GLOBAL 0 (True)12 COMPARE_OP 8 (is)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
ifaisTrue:
...0.141321897507
dis(a)
9LOAD_GLOBAL 0(True)
12COMPARE_OP 8(is)
15POP_JUMP_IF_FALSE 22
7 18LOAD_GLOBAL 0(True)
21RETURN_VALUE
25RETURN_VALUE
def a:a = Trueif a == True:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.149966001511>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (True)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 LOAD_GLOBAL 0 (True)12 COMPARE_OP 2 (==)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
ifa==True:
...0.149966001511
dis(a)
9LOAD_GLOBAL 0(True)
12COMPARE_OP 2(==)
8 22LOAD_GLOBAL 1(False)
测试用例 6更快的方式:
def a:a = 1if not a is 2:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.0980911254883>>> >>> dis(a)5 0 LOAD_CONST 1 (1)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 LOAD_CONST 2 (2)12 COMPARE_OP 9 (is not)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
...0.0980911254883
dis(a)
5 0LOAD_CONST 1(1)
9LOAD_CONST 2(2)
12COMPARE_OP 9(isnot)
def a:a = 1if a is not 2:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.10059595108>>> >>> dis(a)5 0 LOAD_CONST 1 (1)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 LOAD_CONST 2 (2)12 COMPARE_OP 9 (is not)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
...0.10059595108
dis(a)
def a:a = 1if a != 2:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.102056026459>>> >>> dis(a)5 0 LOAD_CONST 1 (1)3 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 LOAD_CONST 2 (2)12 COMPARE_OP 3 (!=)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
ifa!=2:
...0.102056026459
dis(a)
9LOAD_CONST 2(2)
12COMPARE_OP 3(!=)
测试用例 7更快的方式:
def a:a = if a:return Falsereturn True>>> >>> timeit(a, number=1000000)... 0.111177921295>>> >>> dis(a)5 0 BUILD_LIST 03 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 POP_JUMP_IF_FALSE 167 12 LOAD_GLOBAL 0 (False)15 RETURN_VALUE 8 >> 16 LOAD_GLOBAL 1 (True)19 RETURN_VALUE >>>
...0.111177921295
dis(a)
5 0BUILD_LIST 0
7 12LOAD_GLOBAL 0(False)
def a:a = if not a:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.113872051239>>> >>> dis(a)5 0 BUILD_LIST 03 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 POP_JUMP_IF_TRUE 167 12 LOAD_GLOBAL 0 (True)15 RETURN_VALUE 8 >> 16 LOAD_GLOBAL 1 (False)19 RETURN_VALUE >>>
...0.113872051239
dis(a)
9POP_JUMP_IF_TRUE 16
8 16LOAD_GLOBAL 1(False)
def a:a = if a == :return Truereturn False>>> >>> timeit(a, number=1000000)... 0.16094994545>>> >>> dis(a)5 0 BUILD_LIST 03 STORE_FAST 0 (a)6 6 LOAD_FAST 0 (a)9 BUILD_LIST 012 COMPARE_OP 2 (==)15 POP_JUMP_IF_FALSE 227 18 LOAD_GLOBAL 0 (True)21 RETURN_VALUE 8 >> 22 LOAD_GLOBAL 1 (False)25 RETURN_VALUE >>>
...0.16094994545
dis(a)
9BUILD_LIST 0
12COMPARE_OP 2(==)
测试用例 8更快的方式:
def a:a = objectif not a:return Falsereturn True>>> >>> timeit(a, number=1000000)... 0.150635004044>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (object)3 CALL_FUNCTION 06 STORE_FAST 0 (a)6 9 LOAD_FAST 0 (a)12 POP_JUMP_IF_TRUE 197 15 LOAD_GLOBAL 1 (False)18 RETURN_VALUE 8 >> 19 LOAD_GLOBAL 2 (True)22 RETURN_VALUE >>>
ifnota:
...0.150635004044
dis(a)
5 0LOAD_GLOBAL 0(object)
6STORE_FAST 0(a)
6 9LOAD_FAST 0(a)
12POP_JUMP_IF_TRUE 19
7 15LOAD_GLOBAL 1(False)
18RETURN_VALUE
8 19LOAD_GLOBAL 2(True)
def a:a = objectif a is None:return Falsereturn True>>> >>> timeit(a, number=1000000)... 0.15754199028>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (object)3 CALL_FUNCTION 06 STORE_FAST 0 (a)6 9 LOAD_FAST 0 (a)12 LOAD_CONST 0 (None)15 COMPARE_OP 8 (is)18 POP_JUMP_IF_FALSE 257 21 LOAD_GLOBAL 2 (False)24 RETURN_VALUE 8 >> 25 LOAD_GLOBAL 3 (True)28 RETURN_VALUE >>>
...0.15754199028
dis(a)
12LOAD_CONST 0(None)
15COMPARE_OP 8(is)
18POP_JUMP_IF_FALSE 25
7 21LOAD_GLOBAL 2(False)
24RETURN_VALUE
8 25LOAD_GLOBAL 3(True)
def a:a = objectif a:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.157824993134>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (object)3 CALL_FUNCTION 06 STORE_FAST 0 (a)6 9 LOAD_FAST 0 (a)12 POP_JUMP_IF_FALSE 197 15 LOAD_GLOBAL 1 (True)18 RETURN_VALUE 8 >> 19 LOAD_GLOBAL 2 (False)22 RETURN_VALUE >>>
ifa:
...0.157824993134
dis(a)
12POP_JUMP_IF_FALSE 19
7 15LOAD_GLOBAL 1(True)
8 19LOAD_GLOBAL 2(False)
def a:a = objectif a is not None:return Truereturn False>>> >>> timeit(a, number=1000000)... 0.181853055954>>> >>> dis(a)5 0 LOAD_GLOBAL 0 (object)3 CALL_FUNCTION 06 STORE_FAST 0 (a)6 9 LOAD_FAST 0 (a)12 LOAD_CONST 0 (None)15 COMPARE_OP 9 (is not)18 POP_JUMP_IF_FALSE 257 21 LOAD_GLOBAL 2 (True)24 RETURN_VALUE 8 >> 25 LOAD_GLOBAL 3 (False)28 RETURN_VALUE >>>
ifaisnotNone:
...0.181853055954
dis(a)
12LOAD_CONST 0(None)
15COMPARE_OP 9(isnot)
7 21LOAD_GLOBAL 2(True)
8 25LOAD_GLOBAL 3(False)
28RETURN_VALUE
测试用例 9更快的方式:
def a:a = [1, 2, 3, 4, 5]s = 0for p, v in enumerate(a):s += ps += vreturn s>>> >>> timeit(a, number=1000000)... 0.738418102264>>> >>> dis(a)5 0 LOAD_CONST 1 (1)3 LOAD_CONST 2 (2)6 LOAD_CONST 3 (3)9 LOAD_CONST 4 (4)12 LOAD_CONST 5 (5)15 BUILD_LIST 518 STORE_FAST 0 (a)6 21 LOAD_CONST 6 (0)24 STORE_FAST 1 (s)7 27 SETUP_LOOP 46 (to 76)30 LOAD_GLOBAL 0 (enumerate)33 LOAD_FAST 0 (a)36 CALL_FUNCTION 139 GET_ITER >> 40 FOR_ITER 32 (to 75)43 UNPACK_SEQUENCE 246 STORE_FAST 2 (p)49 STORE_FAST 3 (v)8 52 LOAD_FAST 1 (s)55 LOAD_FAST 2 (p)58 INPLACE_ADD 59 STORE_FAST 1 (s)9 62 LOAD_FAST 1 (s)65 LOAD_FAST 3 (v)68 INPLACE_ADD 69 STORE_FAST 1 (s)72 JUMP_ABSOLUTE 40>> 75 POP_BLOCK 10 >> 76 LOAD_FAST 1 (s)79 RETURN_VALUE >>> a=[12345]s=0
forpvinenumerate(a):
s+=p
s+=v
returns
...0.738418102264
dis(a)
3LOAD_CONST 2(2)
6LOAD_CONST 3(3)
9LOAD_CONST 4(4)
12LOAD_CONST 5(5)
15BUILD_LIST 5
18STORE_FAST 0(a)
6 21LOAD_CONST 6(0)
24STORE_FAST 1(s)
7 27SETUP_LOOP 46(to76)
30LOAD_GLOBAL 0(enumerate)
33LOAD_FAST 0(a)
36CALL_FUNCTION 1
39GET_ITER
40FOR_ITER 32(to75)
43UNPACK_SEQUENCE 2
46STORE_FAST 2(p)
49STORE_FAST 3(v)
8 52LOAD_FAST 1(s)
55LOAD_FAST 2(p)
58INPLACE_ADD
59STORE_FAST 1(s)
9 62LOAD_FAST 1(s)
65LOAD_FAST 3(v)
68INPLACE_ADD
69STORE_FAST 1(s)
72JUMP_ABSOLUTE 40
75POP_BLOCK
10 76LOAD_FAST 1(s)
79RETURN_VALUE
def a:a = [1, 2, 3, 4, 5]s = 0for i in range(len(a)):s += is += a[i]return s>>> >>> timeit(a, number=1000000)... 0.800552845001>>> >>> dis(a)5 0 LOAD_CONST 1 (1)3 LOAD_CONST 2 (2)6 LOAD_CONST 3 (3)9 LOAD_CONST 4 (4)12 LOAD_CONST 5 (5)15 BUILD_LIST 518 STORE_FAST 0 (a)6 21 LOAD_CONST 6 (0)24 STORE_FAST 1 (s)7 27 SETUP_LOOP 50 (to 80)30 LOAD_GLOBAL 0 (range)33 LOAD_GLOBAL 1 (len)36 LOAD_FAST 0 (a)39 CALL_FUNCTION 142 CALL_FUNCTION 145 GET_ITER >> 46 FOR_ITER 30 (to 79)49 STORE_FAST 2 (i)8 52 LOAD_FAST 1 (s)55 LOAD_FAST 2 (i)58 INPLACE_ADD 59 STORE_FAST 1 (s)9 62 LOAD_FAST 1 (s)65 LOAD_FAST 0 (a)68 LOAD_FAST 2 (i)71 BINARY_SUBSCR 72 INPLACE_ADD 73 STORE_FAST 1 (s)76 JUMP_ABSOLUTE 46>> 79 POP_BLOCK 10 >> 80 LOAD_FAST 1 (s)83 RETURN_VALUE >>>s=0
foriinrange(len(a)):
s+=i
s+=a[i]returns
...0.800552845001
dis(a)
7 27SETUP_LOOP 50(to80)
30LOAD_GLOBAL 0(range)
33LOAD_GLOBAL 1(len)
36LOAD_FAST 0(a)
39CALL_FUNCTION 1
42CALL_FUNCTION 1
45GET_ITER
46FOR_ITER 30(to79)
49STORE_FAST 2(i)
55LOAD_FAST 2(i)
65LOAD_FAST 0(a)
68LOAD_FAST 2(i)
71BINARY_SUBSCR
72INPLACE_ADD
73STORE_FAST 1(s)
76JUMP_ABSOLUTE 46
79POP_BLOCK
10 80LOAD_FAST 1(s)
83RETURN_VALUE
测试用例 10更快的方式:
def a:r = ''for i in range(10):r += str(i)return r>>> >>> timeit(a, number=1000000)... 1.63575387001>>> >>> dis(a)5 0 LOAD_CONST 1 ('')3 STORE_FAST 0 (r)6 6 SETUP_LOOP 36 (to 45)9 LOAD_GLOBAL 0 (range)12 LOAD_CONST 2 (10)15 CALL_FUNCTION 118 GET_ITER >> 19 FOR_ITER 22 (to 44)22 STORE_FAST 1 (i)7 25 LOAD_FAST 0 (r)28 LOAD_GLOBAL 1 (str)31 LOAD_FAST 1 (i)34 CALL_FUNCTION 137 INPLACE_ADD 38 STORE_FAST 0 (r)41 JUMP_ABSOLUTE 19>> 44 POP_BLOCK 8 >> 45 LOAD_FAST 0 (r)48 RETURN_VALUE >>>
foriinrange(10):
r+=str(i)
returnr
...1.63575387001
dis(a)
5 0LOAD_CONST 1('')
3STORE_FAST 0(r)
6 6SETUP_LOOP 36(to45)
9LOAD_GLOBAL 0(range)
12LOAD_CONST 2(10)
15CALL_FUNCTION 1
18GET_ITER
19FOR_ITER 22(to44)
22STORE_FAST 1(i)
7 25LOAD_FAST 0(r)
28LOAD_GLOBAL 1(str)
31LOAD_FAST 1(i)
34CALL_FUNCTION 1
37INPLACE_ADD
38STORE_FAST 0(r)
41JUMP_ABSOLUTE 19
44POP_BLOCK
48RETURN_VALUE
def a:r = for i in range(10):r.append(str(i))return ''.join(r)>>> >>> timeit(a, number=1000000)... 2.1280169487>>> >>> dis(a)5 0 BUILD_LIST 03 STORE_FAST 0 (r)6 6 SETUP_LOOP 39 (to 48)9 LOAD_GLOBAL 0 (range)12 LOAD_CONST 1 (10)15 CALL_FUNCTION 118 GET_ITER >> 19 FOR_ITER 25 (to 47)22 STORE_FAST 1 (i)7 25 LOAD_FAST 0 (r)28 LOAD_ATTR 1 (append)31 LOAD_GLOBAL 2 (str)34 LOAD_FAST 1 (i)37 CALL_FUNCTION 140 CALL_FUNCTION 143 POP_TOP 44 JUMP_ABSOLUTE 19>> 47 POP_BLOCK 8 >> 48 LOAD_CONST