Python 3:与Python 2相比,循环,列表理解和映射速度较慢?

时间:2016-03-28 11:43:26

标签: python performance python-2.7 python-3.4

我目前正在学习Python 3,并认为一些速度比较可能很整洁。因此,我创建了一些就地和一些临时列表函数,它们只是将1加到一个长整数列表中。

然而,结果对我来说真的很令人惊讶......似乎Python 3在每个用例中都比较慢:不同的循环测试,while循环,map函数和列表推导。

当然(参见下面的代码)它只是比较了就地列表突变或构建并返回临时列表的循环...例如, "标准" Python 3的地图,只是创建一个迭代器,仍然很快,在某些时候,人们总是希望打印,写入或以某种方式可视化数据。因此,像list(map())这样的东西应该在Python 3中相对常见?!

我在这里缺少什么?

对于循环,理解和映射,Python 3是否比Python 2慢?如果是这样,为什么?

Python 3.4时间

> python3.4 func_speed_tests.py
list_comprehension.........1.2785s
for_loop...................1.9988s
for_loop_append............1.8471s
for_loop_range.............1.7585s
while_loop.................2.2539s
calc_map...................2.0763s

Python 2.7时间

> python2.7 func_speed_tests.py
list_comprehension.........0.9472s
for_loop...................1.2821s
for_loop_append............1.5663s
for_loop_range.............1.3101s
while_loop.................2.1914s
calc_map...................1.9101s

以下是代码

import timeit
from random import shuffle

# generate a long list of integers
mlst = list(range(0, 1000000))

# randomly sort the list
shuffle(mlst)

# number of benchmark passes
n = 10


#####################
# functions to time #
#####################

def list_comprehension(lst):
    return [x + 1 for x in lst]


def for_loop(lst):
    for k, v in enumerate(lst):
        lst[k] = v + 1


def for_loop_append(lst):
    tmp = []
    for item in lst:
        tmp.append(item + 1)


def for_loop_range(lst):
    for k in range(len(lst)):
        lst[k] += 1
    return lst


def while_loop(lst):
    it = iter(lst)
    tmp = []
    while it:
        try:
            tmp.append(next(it)+1)
        except StopIteration:
            break
    return tmp


def calc_map(lst):
    lst = map(lambda x: x + 1, lst)
    return list(lst)


############################################
# helper functions for timing and printing #
############################################   

def print_time(func_name):
    print("{:.<25}{:.>8.4f}s".format(func_name, timer(func_name)))


def timer(func):
    return timeit.timeit(stmt="{}(mlst)".format(func),
                         setup="from __main__ import mlst, {}".format(func),
                         number=n)

#################
# run the tests #
#################

print_time("list_comprehension")
print_time("for_loop")
print_time("for_loop_append")
print_time("for_loop_range")
print_time("while_loop")
print_time("calc_map")

1 个答案:

答案 0 :(得分:1)

Python3比Python2慢一点。查看pystone benchmark。如果关注速度,请坚持使用Python 2.7.0 Release,这样可以获得更好的第三方软件包支持。