首页 > 解决方案 > 元组与生成器表达式。为什么性能翻转,序列越长?

问题描述

我正在查看以下代码,并认为我注意到了潜在的性能问题。

def multiply(x):
    return x * 10

def test():
    data = tuple(x for x in range(5))

    first_map = tuple(map(
        multiply,
        tuple(x for x in data)
    ))
    second_map = tuple(map(
        multiply,
        tuple(x for x in data)
    ))

    ziped = tuple(zip(data, second_map, first_map))
    return ziped

import timeit
print(timeit.timeit('test()', globals=globals()))

为我运行此打印5.317162958992412

我认为所有这些中间体tuple都会导致对数据的多次迭代,所以我把它变成了以下内容。

def multiply(x):
    return x * 10

def test():
    data = tuple(x for x in range(5))

    first_map = map(
        multiply,
        (x for x in data)
    )
    second_map = map(
        multiply,
        (x for x in data)
    )

    ziped = tuple(zip(data, second_map, first_map))
    return ziped

import timeit
print(timeit.timeit('test()', globals=globals()))

事实上,4.783027238998329为我运行这个打印,所以我们优化了性能。耶!

但现在是令人惊讶的(对我来说)部分!. 当我们放大数据时,结果会翻转!

换句话说,如果我们更改datadata = tuple(x for x in range(50)),那么具有中间元组的版本会变得更快。

我错过了什么?

标签: pythonperformancetuplesgenerator

解决方案


推荐阅读