Python list comprehension expensive
我试图找到列表理解的有效性,但它看起来比正常的函数操作更昂贵。有人能解释吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def squares(values): lst = [] for x in range(values): lst.append(x*x) return lst def main(): t = timeit.Timer(stmt="lst = [x*x for x in range(10)]") print t.timeit() t = timeit.Timer(stmt="squares",setup="from __main__ import squares") print t.timeit() lst = [x*x for x in range(10)] print lst print squares(10) ----Output:--- 2.4147507644 0.0284455255965 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] |
对于相同的输出,与列表理解相比,普通函数计算的时间要短得多。
我觉得单子的理解更有效。
您从不调用您的
列表理解实际上更快:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> import timeit >>> def squares(values): ... lst = [] ... for x in range(values): ... lst.append(x*x) ... return lst ... >>> def squares_comp(values): ... return [x*x for x in range(values)] ... >>> timeit.timeit('f(10)', 'from __main__ import squares as f') 3.9415171146392822 >>> timeit.timeit('f(10)', 'from __main__ import squares_comp as f') 2.3243820667266846 |
如果使用
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 39 | >>> import dis >>> dis.dis(squares) 2 0 BUILD_LIST 0 3 STORE_FAST 1 (lst) 3 6 SETUP_LOOP 37 (to 46) 9 LOAD_GLOBAL 0 (range) 12 LOAD_FAST 0 (values) 15 CALL_FUNCTION 1 18 GET_ITER >> 19 FOR_ITER 23 (to 45) 22 STORE_FAST 2 (x) 4 25 LOAD_FAST 1 (lst) 28 LOAD_ATTR 1 (append) 31 LOAD_FAST 2 (x) 34 LOAD_FAST 2 (x) 37 BINARY_MULTIPLY 38 CALL_FUNCTION 1 41 POP_TOP 42 JUMP_ABSOLUTE 19 >> 45 POP_BLOCK 5 >> 46 LOAD_FAST 1 (lst) 49 RETURN_VALUE >>> dis.dis(squares_comp) 2 0 BUILD_LIST 0 3 LOAD_GLOBAL 0 (range) 6 LOAD_FAST 0 (values) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 16 (to 32) 16 STORE_FAST 1 (x) 19 LOAD_FAST 1 (x) 22 LOAD_FAST 1 (x) 25 BINARY_MULTIPLY 26 LIST_APPEND 2 29 JUMP_ABSOLUTE 13 >> 32 RETURN_VALUE |
号
另一方面,清单理解并不一定要做这项工作。相反,python使用