Python 3 : Loops, 列表理解和映射比 Python 2 慢?

标签 python performance python-2.7 python-3.4

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

但是,结果确实令我惊讶……似乎 Python 3 在每个用例中都比较慢:不同的测试 for 循环、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")

最佳答案

Python3 比 Python2 稍微慢一些。检查pystone benchmark 。如果关心速度,请坚持使用 Python 2.7.0 Release它具有更好的第三方软件包支持。

关于Python 3 : Loops, 列表理解和映射比 Python 2 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261621/

相关文章:

python - os.killpg 寻找什么 PID

python - 终止正在运行的 Python 应用程序

python - 我可以使用 Numba、矢量化或多处理加速这种空气动力学计算吗?

python - 按字母顺序排列句子并计算每个单词出现的次数并打印在表格中

python - 为什么我无法在此嵌套字典中创建其他键?

python - Django 设置

python - modbus-tk 用于 Modbus RTU,读/写多个寄存器(fn 代码 23),返回异常代码 1

python - sqlite 真空与 django

django - 加速 Django 中的单元测试

java - 是否可以在所有情况下比较两个 .java 文件的方法和字段?