【问题标题】:Why is it more efficient to create a small array, and then expand it, rather than to create an array entirely from a large list?为什么创建一个小数组然后扩展它比完全从一个大列表创建一个数组更有效?
【发布时间】:2019-05-01 03:45:46
【问题描述】:

在一本书中找到以下代码,但无法得到完整的解释。

x = array('d', [0] * 1000000)
x = array('d', [0]) * 1000000 

第一种情况下的 python 代码是创建一个长度为 1000000 的数组,而在第二部分中是创建一个单一大小的数组并将大小乘以相同的因子。 第二种情况的代码比第一种情况快 100 倍。

速度差异的确切原因是什么?数组的python实现是如何发挥作用的?

【问题讨论】:

    标签: python arrays python-3.x performance


    【解决方案1】:

    Python list 存储 Python 对象,但 array.array 对象存储原始 C 数据类型。

    第一行需要单独处理[0] * 1000000 中的每个对象,遵循指针并执行类型检查、动态分派和引用计数以及所有这些一百万次来处理每个元素并将其数据转换为原始 C 双精度。每个元素恰好是相同的,但 array 构造函数不知道这一点。还有构建和清理百万元素列表的费用。

    第二行更简单。 Python 可以 memcpy 数组的内容一百万次。

    【讨论】:

    • 但是memcpy函数必须花费时间动态分配新指针,并将数据复制到第二行的新内存单元中。
    • @AnshulJain:不,它没有。 memcpy 不分配。也许您的印象是array.array 数组存储 Python 对象?
    • @AnshulJain 你能用 array('d', itertools.repeat(0,1000000 )) 对其进行基准测试吗?那至少应该跳过构建临时列表。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2017-05-06
    • 2013-08-21
    相关资源
    最近更新 更多