迭代2个相同长度的列表;不使用生成器创建n个连续数字的列表

时间:2017-06-03 15:33:00

标签: python list

我见过有关在python中创建N个数字列表的问题。假设输入N = 6应该创建[0,1,2,3,4,5]。我看到的所有答案都有范围功能。现在我正在使用Python 3.在执行范围函数创建列表时,我看到代码执行缓慢,一次弹出1位数,因为范围是生成器函数。

是否有另一种方法可以创建一个连续数字列表(假设一个非常大的数字),它不使用范围等生成器函数,这样就没有减速?我可以使用C类方法来检查n< N但是有更多的Pythonic方式吗?

请在IDLE中运行此代码以更清楚地理解我的问题:

forEach

2 个答案:

答案 0 :(得分:3)

通常,使用生成器 Pythonic的方法。生成器往往在Python中非常快。让我们首先看一下创建N个整数的预先计算列表的不同方法:

import timeit

print(
    "Generating list from range:",
    timeit.timeit("list(range(100))")
)
print(
    "Generating list with comprehension:",
    timeit.timeit("[i for i in range(100)]")
)
print(
    "Generating list with while:",
    timeit.timeit(
        """\
i = 0
res = []
while i < 100:
    res.append(i)
    i += 1"""
    )
)

在我的系统上(使用Python 3.5.2),这给出了:

Generating list from range: 1.0031339479999133
Generating list with comprehension: 3.2253709860001436
Generating list with while: 12.400529407000022

因此,如果您只是尝试创建N个整数的预计算列表,只需将范围对象直接转换为列表即可获得最佳性能。现在,让我们看看在预先计算列表上进行迭代而不是在范围对象上进行迭代时会发生什么:

print(
    "Precomputed range:",
    timeit.timeit(
        '[x for x in seq]',
        setup='seq = range(100)'
    )
)

print(
    "Precomputed list:",
    timeit.timeit(
        '[x for x in seq]',
        setup='seq = list(range(100))'
    )
)

在我的系统上,这会产生

Precomputed range: 3.063208956000153
Precomputed list: 3.0270772009998836

对范围对象与预先计算列表进行迭代的性能差异可以忽略不计。因此,一般情况下,如果您需要一个具有N个整数的迭代,我会优先使用范围对象,而不考虑性能因素。

答案 1 :(得分:0)

我的坏。我查了一下,发现我说的延迟不是因为使用了发电机。与我的IDE PyCharm相比,看起来IDLE缓慢执行print语句。在Pycharm中,所有输出都会立即打印出来。

与Pycharm相比,IDLE中相同的代码运行速度要慢得多。