python慢为什么用的人还很多_为什么Python 3比Python 2慢得多?

参见英文答案 >

Is there a reason Python 3 enumerates slower than Python 2?                                    2个答案                            我一直在试图理解为什么Python 3实际上比Python 2在某些情况下花费了很多时间,下面是我已经验证从python 3.4到python 2.7的几个例子。

我试过这段代码显示它是如何区别:

MAX_NUM = 3*10**7

# This is to make compatible with py3.4.

try:

xrange

except:

xrange = range

def foo():

i = MAX_NUM

while i> 0:

i -= 1

def foo_for():

for i in xrange(MAX_NUM):

pass

当我试着运行这个程序与py3.4和py2.7我有以下

结果。

注意:这些统计通过一个64位的机器与2.6Ghz处理器,并计算时间使用time.time()在单循环。

Output : Python 3.4

-----------------

2.6392083168029785

0.9724123477935791

Output: Python 2.7

------------------

1.5131521225

0.475143909454

我真的不认为有更改应用于while或xrange从2.7到3.4,我知道范围已经开始作为xrange在py3.4,但文档说

range() now behaves like xrange() used to behave, except it works with values of arbitrary size. The latter no longer exists.

这意味着从xrange到range的更改非常等于名称更改,但使用任意值。

我已经验证了反汇编的字节代码。

下面是函数foo()的反汇编字节码:

Python 3.4:

---------------

13 0 LOAD_GLOBAL 0 (MAX_NUM)

3 STORE_FAST 0 (i)

14 6 SETUP_LOOP 26 (to 35)

>> 9 LOAD_FAST 0 (i)

12 LOAD_CONST 1 (0)

15 COMPARE_OP 4 (>)

18 POP_JUMP_IF_FALSE 34

15 21 LOAD_FAST 0 (i)

24 LOAD_CONST 2 (1)

27 INPLACE_SUBTRACT

28 STORE_FAST 0 (i)

31 JUMP_ABSOLUTE 9

>> 34 POP_BLOCK

>> 35 LOAD_CONST 0 (None)

38 RETURN_VALUE

python 2.7

-------------

13 0 LOAD_GLOBAL 0 (MAX_NUM)

3 STORE_FAST 0 (i)

14 6 SETUP_LOOP 26 (to 35)

>> 9 LOAD_FAST 0 (i)

12 LOAD_CONST 1 (0)

15 COMPARE_OP 4 (>)

18 POP_JUMP_IF_FALSE 34

15 21 LOAD_FAST 0 (i)

24 LOAD_CONST 2 (1)

27 INPLACE_SUBTRACT

28 STORE_FAST 0 (i)

31 JUMP_ABSOLUTE 9

>> 34 POP_BLOCK

>> 35 LOAD_CONST 0 (None)

38 RETURN_VALUE

下面是函数foo_for()的反汇编字节码:

Python: 3.4

19 0 SETUP_LOOP 20 (to 23)

3 LOAD_GLOBAL 0 (xrange)

6 LOAD_GLOBAL 1 (MAX_NUM)

9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)

12 GET_ITER

>> 13 FOR_ITER 6 (to 22)

16 STORE_FAST 0 (i)

20 19 JUMP_ABSOLUTE 13

>> 22 POP_BLOCK

>> 23 LOAD_CONST 0 (None)

26 RETURN_VALUE

Python: 2.7

-------------

19 0 SETUP_LOOP 20 (to 23)

3 LOAD_GLOBAL 0 (xrange)

6 LOAD_GLOBAL 1 (MAX_NUM)

9 CALL_FUNCTION 1

12 GET_ITER

>> 13 FOR_ITER 6 (to 22)

16 STORE_FAST 0 (i)

20 19 JUMP_ABSOLUTE 13

>> 22 POP_BLOCK

>> 23 LOAD_CONST 0 (None)

26 RETURN_VALUE

如果我们比较两个字节代码,他们产生了相同的反汇编字节代码。

现在我想知道从2.7到3.4是什么改变真的导致执行时间在给定的代码段的巨大变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值