【问题标题】:Why indexing list is slower than allocating a new list?为什么索引列表比分配新列表慢?
【发布时间】:2021-01-08 07:24:58
【问题描述】:

我认为索引列表会比额外的内存分配快得多。然而,下面的代码却产生了相当令人惊讶的结果。

import random, timeit
from scipy import stats

random.seed(42)
a = [random.randint(-10000, 10000) for _ in range(10000)]

def new_list(a):
    b = []
    for v in a:
        b.append(v*2)

def in_place(a):
    for i in range(len(a)):
        a[i] *= 2

print(stats.describe(timeit.repeat("new_list(a_cp)", setup="a_cp = a.copy()",
                                    number=100, globals=globals())))
print(stats.describe(timeit.repeat("in_place(a_cp)", setup="a_cp = a.copy()",
                                    number=100, globals=globals())))

我得到的结果是

DescribeResult(nobs=5, minmax=(0.16783145900000007, 0.2041749690000001), mean=0.18718994520000004, variance=0.00018897353500515855, skewness=-0.23156148623021452, kurtosis=-1.0041025476826309)
DescribeResult(nobs=5, minmax=(0.25297652999999976, 0.2932831710000001), mean=0.2716082258, variance=0.00024360213447797058, skewness=0.2423908282124137, kurtosis=-1.136485780718656)

这是相当不同的,不是吗?尽管如果性能真的很重要,我宁愿使用numpy,但我找不到一个很好的理由说明分配新内存比通过指针传输更快。谁能帮帮我?

编辑:: 由于我的问题有点不清楚,所以我更改了标题并删除了一些句子。

【问题讨论】:

    标签: python python-3.x loops


    【解决方案1】:

    它不是改变慢的列表而是索引它。如果您更改 new_list 函数以使用索引以及后者会更快:

    def new_list(a):
        b = []
        for i in range(len(a)):
            b.append(a[i] * 2)
    

    【讨论】:

    • 我同意你的观点,但我的问题是为什么索引比分配内存慢。也许我必须编辑我的问题以使其足够清楚......
    • 索引不比分配内存慢;它比遍历列表要慢(如预期的那样)。改变列表实际上比分配一个新列表要快。您现有的代码不会将苹果与苹果进行比较。
    • 感谢您的解释。我现在明白了。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 2020-02-03
    • 1970-01-01
    • 2021-11-23
    • 2019-07-30
    相关资源
    最近更新 更多