Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

Python -- 让你的代码运行的更快的技巧

$
0
0
python -- 让你的代码运行的更快的技巧

昨天来源:伯乐在线

注:个人学习记录用。建议大家看原文,原文对比更加清晰,一目了然。

注:各位要使用这些技巧的话,请在自己的服务器上测试一遍,并且加大测试的数值,目前的用例都是 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

Viewing all articles
Browse latest Browse all 9596

Trending Articles