当前位置: 首页 > 面试题库 >

list(…).insert(…)的性能

金骞尧
2023-03-14
问题内容

我考虑了以下有关计算机体系结构的问题。假设我在Python中做

from bisect import bisect
index = bisect(x, a)      # O(log n)  (also, shouldn't it be a standard list function?)
x.insert(index, a)        # O(1) + memcpy()

这需要log n,再加上,如果我理解正确,内存复制操作x[index:]。现在我最近读到,瓶颈通常是处理器与内存之间的通信,因此可以通过RAM快速完成内存复制。它是如何工作的?


问题答案:

Python是一种语言。存在多种实现,并且它们可能具有列表的不同实现。因此,如果不查看实际实现的代码,就无法确定列表的实现方式以及它们在某些情况下的行为。

我敢打赌,列表中对象的引用存储在连续内存中(肯定不是链接列表…)。如果确实如此,则使用插入x.insert将导致移动所插入元素后面的所有元素。这可以通过硬件有效地完成,但是复杂度仍然是O(n)。

对于小列表,该bisect操作可能需要花费更多时间x.insert,即使前者是O(log n)而后者是O(n)。但是,对于长列表,我可能会猜测x.insert是瓶颈。在这种情况下,您必须考虑使用其他数据结构。



 类似资料:
  • Python3 列表 描述 insert() 函数用于将指定对象插入列表的指定位置。 语法 insert()方法语法: list.insert(index, obj) 参数 index -- 对象obj需要插入的索引位置。 obj -- 要插入列表中的对象。 返回值 该方法没有返回值,但会在列表指定位置插入对象。 实例 以下实例展示了 insert()函数的使用方法: #!/usr/bin/

  • 问题内容: 优化SQLite是棘手的。C应用程序的大容量插入性能可以从每秒85次插入到每秒96,000次以上插入! 背景:我们正在将SQLite用作桌面应用程序的一部分。我们将大量配置数据存储在XML文件中,这些文件会被解析并加载到SQLite数据库中,以便在初始化应用程序时进行进一步处理。SQLite非常适合这种情况,因为它速度快,不需要专门的配置,并且数据库作为单个文件存储在磁盘上。 基本原理

  • 全部显示 返回或设置命令栏的组合框控件中某项的值。String 类型,可读写。 注意对于内置的组合框控件,该属性为只读。 expression.List(Index) expression 必需。该表达式返回一个CommandBarComboBox 对象。 IndexLong 类型,必需。要设置的项。 示例 本示例可实现的功能为:查看标题为“Stock Data”的组合框控件(该控件位于命令栏“C

  • 首先让我们快速地看看 insert 一行时的处理步骤。这些步骤中的每一步都有优化的潜力,对此我们在后面会一一讨论。 1、在客户机准备语句。对于动态 SQL,在语句执行前就要做这一步,此处的性能是很重要的;对于静态 SQL,这一步的性能实际上关系不大,因为语句的准备是事先完成的。 2、在客户机,将要插入的行的各个列值组装起来,发送到 DB2 服务器。 3、DB2 服务器确定将这一行插入到哪一页中。

  • 线性表(Linear List) 1. 线性表的概念 线性表是最基本、最简单、也是最常用的一种数据结构。 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。 在数据结构逻辑层次上细分,线

  • 问题内容: 有谁知道从INSERT查询中删除字段名称是否会带来一些性能改进? 我的意思是这样的: 比完成此任务更快地完成数据库: ? 我知道这可能是毫无意义的性能差异,但只是要知道。 我通常使用MySQL和PostgreSQL作为数据库。 问题答案: 不,实际上相反! 至少对于Microsoft SQL Server-您没有指定要使用的数据库..... 如果您未在SELECT或INSERT中指定字