注:个人学习记录用。建议大家看原文,原文对比更加清晰,一目了然。
注:各位要使用这些技巧的话,请在自己的服务器上测试一遍,并且加大测试的数值,目前的用例都是 10 W 次,我们可以测试 100 W , 1000 W 次。。。。
注:如果测试的性能相差不多,请以可读性为主。
平台
运行测试的平台环境:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> 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
更快的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def a(): d = {} return d >>> >>> timeit(a, number=1000000) ... 0.0905051231384 >>> >>> dis(a) 5 0 BUILD_MAP 0 3 STORE_FAST 0 (d) 6 6 LOAD_FAST 0 (d) 9 RETURN_VALUE >>> |
更慢的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def a(): d = dict() return d >>> >>> timeit(a, number=1000000) ... 0.206549167633 >>> >>> dis(a) 5 0 LOAD_GLOBAL 0 (dict) 3 CALL_FUNCTION 0 6 STORE_FAST 0 (d) 6 9 LOAD_FAST 0 (d) 12 RETURN_VALUE >>> |
测试用例 2
更快的方式:
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 29 30 31 32 33 |
def a(): l = [0, 8, 6, 4, 2, 1, 3, 5, 7, 9] l.sort() return 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 10 33 STORE_FAST 0 (l) 6 36 LOAD_FAST 0 (l) 39 LOAD_ATTR 0 (sort) 42 CALL_FUNCTION 0 45 POP_TOP 7 46 LOAD_FAST 0 (l) 49 RETURN_VALUE >>> |
更慢的方式:
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 29 30 |
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 10 33 STORE_FAST 0 (l) 6 36 LOAD_GLOBAL 0 (sorted) 39 LOAD_FAST 0 (l) 42 CALL_FUNCTION 1 45 RETURN_VALUE >>> |
测试用例 3
更快的方式:
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 29 30 31 32 33 34 35 36 37 38 |
def a(): |