实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用。
如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常情况下链表不是一个很好的结构。
通常链表会作为一个很好的反例,告诉大家脱离实际硬件环境来谈论所谓算法复杂度是没有任何意义的。
这是因为,链表已经不适合当今的计算机硬件发展。当今的计算机硬件对内存是否连续更为敏感,而链表恰恰会破坏这种顺序读取。
由于locality很差所以常常造成page fault和cache miss
这也是为什么大多数教师不再推荐使用链表的原因。而且现今的硬件内存拷贝实际相当迅速。
并且python的list算法不是通常的单项表,也不是通常的数组。
具体可以看这里:http://wiki.python.org/moin/TimeComplexity
在List末尾append/pop都是O(1)的,
如果要在头部或者中部插入是O(n),任何破坏连续性的操作都会被要求realloc,所以任何此类操作都是O(n)
但是当今的常用硬件,使用C写的链表和python的list,在insert的时候只有n>50000才让链表比list快那么一点点。
这还没有考虑其他实际操作的复杂度。加上前面说的破坏locality,导致链表完全没有吸引力。在对象特别多的时候通常我们直接抽象它为数据库,也不要去想什么链表了。

在需要用到linked list特性的地方,比如常常需要从头部append或者pop
这时候有python的deque. (这里我记错了,特此更正,deque如果做insert还是会导致内存拷贝/移动,这里面的关键思想就是目前硬件的内存拷贝相当快,不是相当长的东西都可以接受)
deque也不是通常的简单数据结构,它是经过认真权衡过后得到的一种混合式数据结构。
他是一个链式块结构,每个块包含62个对象,以此来平衡对locality的优化和对push, pop的优化。有人问为啥是62个而不是其他数:那是因为deque是个双向链表,一个节点64个指针,一个指向前一个指向后,剩下就是62个指针用来指向对象

要做到对insert到中间的优化是用btree和array结合的办法,有个第三方包blist
但是我估计很少有应用会真正用到这个。insert是O(log n)
http://pypi.python.org/pypi/blist/

其实python是大师设计的语言,他们来决定底层具体的数据结构,作为一般人,你没有必要去质疑大师们精心设计的东西。
如果你真的对性能有很大要求,python也许并不适合你,python不是作为纯粹针对高性能计算诞生的东西,
他是一种胶水语言,它只对常见的List长度,常用的算法结构进行优化。他希望达到的目的是把现实的应用抽象出来,让使用者不用关心具体的数据结构和算法。
pythonic是一种面向大众的编程态度

如果你要用它来做其他事情,可以看看有没有你需要的第三方模块,或者可以用C来实现自己的一个模块,python本来就是C写的,所以这实际上也一点不困难。
比如python里面没有一个数据结构是能用来很好表示数值运算中使用的大型矩阵或者数组的,这时候就诞生了第三方包:numpy

[转]为什么python标准库没有实现链表的更多相关文章

  1. Python - 标准库概况 - 第二十一天

    Python 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. 建议使用 "import os" 风格而非 "from os import *&quo ...

  2. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  3. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  4. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

  5. python标准库xml.etree.ElementTree的bug

    使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...

  6. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  7. Python标准库

    Python标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉Python标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题都可以简单快捷地使用它们来解决. sys模块 ...

  8. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  9. Python标准库04 文件管理 (部分os包,shutil包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令 ...

随机推荐

  1. 转载-KMP算法前缀数组优雅实现

    转自:http://www.cnblogs.com/10jschen/archive/2012/08/21/2648451.html 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见 ...

  2. C++基类和派生类之间的转换

    本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...

  3. IRP_MJ_CREATE

    原文链接:http://laokaddk.blog.51cto.com/368606/125553/ MSDN:https://msdn.microsoft.com/library/windows/h ...

  4. Idiomatic Python手记一: average in FP way

    方法一: import operator def average(*args): return reduce(operator.add, args) / len(args) if args else ...

  5. HW6.2

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. Android实例-监测网络状态及一些事件(XE8+小米2)

    结果: 1.网络连接:是指现在可不可以上网(你非要问我什么是网,我会K你呀的). 2.WIFI网络:是指现在可以上网,用的是不是WIFI网络(如果你打开了WIFI那它会显示正在使用WIFI). 3.移 ...

  7. SQL2008-功能设置

    1.问题:修改表字段类型后,无法保存答:工具—选项—Designers—表设计器和数据库设计器—阻止保存要求重新创建表的更改前的勾去掉. 2.问题: 编写SQL语句的地方怎么自动换行答:工具-> ...

  8. WinForm中当TextBox重新获得焦点时输入法失效问题

    在winform 中,每当TextBox获得焦点时,部分输入法会失效(如智能ABC.五笔98.极品五笔等),需要重新切换输入法才能正常使用. 此时要将Form的ImeMode属性改为:OnHalf(或 ...

  9. 转载Entity Framework全面教程

    转载原地址:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672754 预备知识    2 LINQ技 ...

  10. JS 实现地区,省份,城市,县区4级联动

    刚学JS,实战一下,做一个省份信息4级联动. 但是网上查了都是3级的,没有4级,现在做一个的是带地区的4级联动,最简单的办法是修改别人的代码,最开始找到的事类似于下边这个的: 省市县关联菜单 < ...