为什么Python 3比Python 2慢很多?

gsb-eng:

我一直在试图理解为什么在某些情况下与Python 2相比Python 3实际上要花费很多时间,以下是我从python 3.4到python 2.7进行验证的几种情况。

注意:我已经经历了一些问题,例如,为什么Python3中没有xrange函数?在python3比python2慢得多环路比同一代码在Python3慢Python2,但我觉得我没有得到这背后问题的实际原因。

我已经尝试了这段代码来展示它是如何发挥作用的:

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 bit带有2.6Ghz处理器计算机,并使用time.time()单循环计算时间

Output : Python 3.4
-----------------
2.6392083168029785
0.9724123477935791

Output: Python 2.7
------------------
1.5131521225
0.475143909454

我真的不认为适用于出现了变化whilexrange从2.7到3.4,我知道range已经开始作为对xrange在py3.4但文件说,

range()现在的行为就像以前一样xrange(),只是它可以使用任意大小的值。后者不再存在。

这意味着从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的什么变化实际上导致给定代码段中执行时间的巨大变化。

马丁·彼得斯(Martijn Pieters):

不同之处在于int类型的实现蟒3.X使用任意大小的整数类型(long在2.X)排他地,而在Python x为值高达sys.maxint更简单的int类型被用于使用一个简单的C long引擎盖下。

将循环限制为long整数后,Python 3.x会更快:

>>> from timeit import timeit
>>> MAX_NUM = 3*10**3
>>> def bar():
...     i = MAX_NUM + sys.maxsize
...     while i > sys.maxsize:
...         i -= 1
... 

Python 2:

>>> timeit(bar, number=10000)
5.704327821731567

Python 3:

>>> timeit(bar, number=10000)
3.7299320790334605

我用sys.maxsize作为sys.maxint从Python 3的下降,但整数值基本相同。

因此,Python 2中的速度差异仅限于第一个(2 ** 63)-64位为1整数,(2 ** 31)-32位系统为1整数。

由于您无法在Python 2上使用该long类型xrange(),因此我没有对该函数进行比较。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么`numpy`在左移时比python慢?

来自分类Dev

为什么coreutils的排序速度比Python慢?

来自分类Dev

为什么Python枚举速度慢?

来自分类Dev

Python:为什么列表理解比for循环慢

来自分类Dev

为什么使用redis的python这么慢?

来自分类Dev

为什么python regex这么慢?

来自分类Python

为什么(1 == 2!= 3)在Python中评估为False?

来自分类Dev

为什么Python开发人员使Python 3比Python 2具有更多的括号?

来自分类Linux

为什么从元组列表中创建python dict比从kwargs中慢3倍

来自分类Python

与“优化的”迭代素数搜索相比,为什么Eratosthenes的Sieve这么慢?(Python 3)

来自分类Dev

为什么 python 中的 sqlite delete table 比 sqlite3 shell 慢数千倍?

来自分类Dev

为什么本例中的Python多线程这么慢?

来自分类Dev

为什么这个脚本在Python中这么慢?

来自分类Dev

为什么我的python代码这么慢(leetcode)?

来自分类Dev

Python | 为什么访问实例属性比本地属性慢?

来自分类Dev

Python:为什么线程函数比非线程慢

来自分类Python

为什么Python对于简单的for循环如此慢?

来自分类Dev

为什么Golang for loop比Python for loop要慢?

来自分类Dev

为什么Quicksum在SCIP python界面中非常慢

来自分类Dev

lambda比python中的函数调用慢,为什么

来自分类Dev

为什么Rust比我的类似Python慢?

来自分类Dev

为什么带有Matplotlib的Python脚本这么慢?

来自分类Dev

为什么Python中的traceback.extract_stack()这么慢?

来自分类Dev

为什么在python中读取大文件这么慢?

来自分类Dev

为什么在我的代码中numba比纯python慢?

来自分类Dev

为什么在Python中x * = y比x = x * y慢?

来自分类Dev

为什么python fibonacci序列循环比递归慢?

来自分类Dev

为什么网格python代码比分解的代码慢?

来自分类Python

为什么在Python 2中''> 0 True?

Related 相关文章

  1. 1

    为什么`numpy`在左移时比python慢?

  2. 2

    为什么coreutils的排序速度比Python慢?

  3. 3

    为什么Python枚举速度慢?

  4. 4

    Python:为什么列表理解比for循环慢

  5. 5

    为什么使用redis的python这么慢?

  6. 6

    为什么python regex这么慢?

  7. 7

    为什么(1 == 2!= 3)在Python中评估为False?

  8. 8

    为什么Python开发人员使Python 3比Python 2具有更多的括号?

  9. 9

    为什么从元组列表中创建python dict比从kwargs中慢3倍

  10. 10

    与“优化的”迭代素数搜索相比,为什么Eratosthenes的Sieve这么慢?(Python 3)

  11. 11

    为什么 python 中的 sqlite delete table 比 sqlite3 shell 慢数千倍?

  12. 12

    为什么本例中的Python多线程这么慢?

  13. 13

    为什么这个脚本在Python中这么慢?

  14. 14

    为什么我的python代码这么慢(leetcode)?

  15. 15

    Python | 为什么访问实例属性比本地属性慢?

  16. 16

    Python:为什么线程函数比非线程慢

  17. 17

    为什么Python对于简单的for循环如此慢?

  18. 18

    为什么Golang for loop比Python for loop要慢?

  19. 19

    为什么Quicksum在SCIP python界面中非常慢

  20. 20

    lambda比python中的函数调用慢,为什么

  21. 21

    为什么Rust比我的类似Python慢?

  22. 22

    为什么带有Matplotlib的Python脚本这么慢?

  23. 23

    为什么Python中的traceback.extract_stack()这么慢?

  24. 24

    为什么在python中读取大文件这么慢?

  25. 25

    为什么在我的代码中numba比纯python慢?

  26. 26

    为什么在Python中x * = y比x = x * y慢?

  27. 27

    为什么python fibonacci序列循环比递归慢?

  28. 28

    为什么网格python代码比分解的代码慢?

  29. 29

    为什么在Python 2中''> 0 True?

热门标签

归档