然而,大部分谈话是关于某人的工作结束刚刚结束 了讨论,他们应该优化代码的其他部分第一 ,它不会不管,除非你做的数以百万计的如果别的。任何人都可以解释这是为什么吗?
通常情况下,如果您确实需要优化代码,也就是说如果程序的性能无法缓慢地运行,您应该只会费心去优化代码。
如果是这样的话,你应该使用一个分析器,以确定哪些部分实际上是造成最多的问题。对于Python而言,cProfile模块对此非常有用。
是否有人了解Python和低水平 执行之间的层,可以解释这是怎么工作的?
如果您想了解代码执行方式,请查看dis模块。
一个简单的例子...
import dis
# Here are the things we might want to do
def do_something_a():
print 'I did a'
def do_something_b():
print 'I did b'
def do_something_c():
print 'I did c'
# Case 1
def f1(x):
if x == 1:
do_something_a()
elif x == 2:
do_something_b()
elif x == 3:
do_something_c()
# Case 2
FUNC_MAP = {1: do_something_a, 2: do_something_b, 3: do_something_c}
def f2(x):
FUNC_MAP[x]()
# Show how the functions execute
print 'Case 1'
dis.dis(f1)
print '\n\nCase 2'
dis.dis(f2)
...这...输出
Case 1
18 0 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_VALUE
Case 2
29 0 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
...所以它是很容易看到哪些函数来执行大多数指令。
至于这实际上要快,这东西你必须通过剖析代码检查。
来源
2013-04-10 11:53:36
Aya
*“我想检查它是哪个号码”*这是什么意思?你的问题可能要更具体一些。 Python如果语句速度很慢,可以通过在C级保持工作来优化Python代码,但这是非常特定的情况,而且您的问题太宽泛。 – jamylak 2013-04-10 10:52:01
所以如果我知道它将是一个数字0到100.我想检查它是否为0,然后做一些事情,如果它是1做别的事情。 – user1938107 2013-04-10 10:54:32
有这么几个号码(0-100),如果你认为你需要优化,然后做一个表,这样就可以直接去回答。但是,您是否真的先尝试过“if”或字典方案?那是......你是否有充分的理由相信超越这两者之一的优化是必要的? – mah 2013-04-10 10:57:14