python - 生成器到列表转换的不同速度

标签 python list generator

问题

所以我编写了一个 python 函数,它通过递归生成嵌套列表的所有元素来展平列表。我想出了 2 个不同版本的生成器创建函数(并非 100% 相同)。

以下是两个版本:

def iterflatten_v1(lst):
    for x in lst:
        if isinstance(x, (list, tuple)):
            yield from iterflatten_v1(x)
        else:
            yield x

def flatten_v1(lst):
    return list(iterflatten_v1(lst))

def iterflatten_v2(lst):
    for x in lst:
        try:
            yield from iterflatten_v2(x)
        except TypeError:
            yield x

def flatten_v2(lst):
    return list(iterflatten_v2(lst))

然后我使用以下代码测试了这两个函数的速度( timing function ):

import time

def timing(f, a, n):
    print(f.__name__)
    r = range(n)
    t1 = time.clock()
    for i in r:
        f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a)
    t2 = time.clock()
    print(round(t2-t1, 3))

nested = [1, 1, 1, [1, 1, [1, 1, 1, [1, 1, 1, 1, [1, 1, 1, 1], 1, 1], 1, 1], 1], 1]
data = [nested for i in range(1000)]

timing(iterflatten_v1, data, 1000)  # 0.003
timing(iterflatten_v2, data, 1000)  # 0.003
timing(flatten_v1, data, 10)  # 1.647
timing(flatten_v2, data, 10)  # 3.005

问题

为什么即使生成器函数具有相同的速度,iterflatten_v1 生成器的转换速度几乎是 iterflatten_v2 生成器的转换速度的两倍?

最佳答案

正如评论中所述,在这种情况下,异常处理比测试类型实例消耗更多的内存。

但是,您对两者的计时都是正确的,并且计时可能会因数据而异(如果数据仅包含整数,您会更频繁地遇到异常,并且 v2 会比 v1 慢)

请注意,如果您没有 tuplelist 的子级,则使用 可以获得 50% 的加速isinstance(检查基类),并检查确切的类型:

def iterflatten_v1(lst):
    for x in lst:
        if type(x) in (list, tuple):
            yield from iterflatten_v1(x)
        else:
            yield x

在我的机器上,isinstance 版本的时间为 1.5 秒,而该版本的时间不到 1 秒。

(是的,我测试了 isinstance(x,collections.Sequence) 并且非常失望,因为它甚至比测试 2 种类型还要慢)

关于python - 生成器到列表转换的不同速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787903/

相关文章:

python - msgpack 解压每个项目之间的数字 '10'

c# - 将 'foreach' 与通用列表一起使用时出现问题

c - 返回列表中的第一个节点

python - 更新列表中的 Python for 循环是如何工作的?

python - 类中的方法可以是生成器吗?

algorithm - 如何在 id 序列中有效地重用已发布的 id

javascript - 如果在迭代期间添加基础集合,是否定义了数组迭代器的行为?

python - Scrapy:存储/抓取当前的 start_url?

python - 比较 GroupBy 中的值并计算匹配的行数

python - 如何将 QPixmap 的图像转换为字节