但是,大多数讨论都是关于某人的工作,最后只是讨论他们应该首先优化代码的其他部分,除非您进行了数百万次的 *** 作,否则这无关紧要。谁能解释为什么?
通常,只有在确实需要的时候才应该优化代码,即,如果程序的性能异常缓慢。
在这种情况下,您应该使用探查器确定哪些零件实际上引起最多的问题。对于Python,cProfile模块对此非常有用。
有人了解python和低级执行之间的层可以解释其工作原理吗?
如果您想了解代码的执行方式,请查看dis模块。
一个简单的例子…
import dis# Here are the things we might want to dodef do_something_a(): print 'I did a'def do_something_b(): print 'I did b'def do_something_c(): print 'I did c'# Case 1def f1(x): if x == 1: do_something_a() elif x == 2: do_something_b() elif x == 3: do_something_c()# Case 2FUNC_MAP = {1: do_something_a, 2: do_something_b, 3: do_something_c}def f2(x): FUNC_MAP[x]()# Show how the functions executeprint 'Case 1'dis.dis(f1)print 'nnCase 2'dis.dis(f2)
…输出…
Case 1 180 LOAD_FAST 0 (x) 3 LOAD_ConST 1 (1) 6 COMPARE_OP 2 (==) 9 POP_JUMP_IF_FALSE 22 19 12 LOAD_GLOBAL 0 (do_something_a) 15 CALL_FUNCTION 0 18 POP_TOP 19 JUMP_FORWARD 44 (to 66) 20 >> 22 LOAD_FAST 0 (x) 25 LOAD_ConST 2 (2) 28 COMPARE_OP 2 (==) 31 POP_JUMP_IF_FALSE 44 21 34 LOAD_GLOBAL 1 (do_something_b) 37 CALL_FUNCTION 0 40 POP_TOP 41 JUMP_FORWARD 22 (to 66) 22 >> 44 LOAD_FAST 0 (x) 47 LOAD_ConST 3 (3) 50 COMPARE_OP 2 (==) 53 POP_JUMP_IF_FALSE 66 23 56 LOAD_GLOBAL 2 (do_something_c) 59 CALL_FUNCTION 0 62 POP_TOP 63 JUMP_FORWARD 0 (to 66) >> 66 LOAD_ConST 0 (None) 69 RETURN_VALUECase 2 290 LOAD_GLOBAL 0 (FUNC_MAP) 3 LOAD_FAST 0 (x) 6 BINARY_SUBSCR 7 CALL_FUNCTION 0 10 POP_TOP 11 LOAD_ConST 0 (None) 14 RETURN_VALUE
…因此,很容易看出哪个函数必须执行最多的指令。
至于哪个实际上更快,那是您必须通过分析代码来检查的事情。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)