28堆和堆排序:为什么说堆排序没有快速排序快?.pdf
《28堆和堆排序:为什么说堆排序没有快速排序快?.pdf》由会员分享,可在线阅读,更多相关《28堆和堆排序:为什么说堆排序没有快速排序快?.pdf(24页珍藏版)》请在文库网上搜索。
1、l) bsObj = BeautifulSoup(html) title = bsObj.find(“h1“).get_text() content = bsObj.find(“div“, “id“:“mw-content-text“).find(“p“).get_text() store(title, content) return bsObj.find(“div“, “id“:“bodyContent“).findAll(“a“, href= pile(“(/wiki/)(?!:).)*$“) links = getLinks(“/wiki/Kevin_Bacon“) try: while
2、 len(links) 0: newArticle = linksrandom.randint(0, len(links)-1).attrs“href“ print(newArticle) links = getLinks(newArticle) finally: cur.close() conn.close() 这里有几点需要注意:首先,charset=utf8 要增加到连接字符串里。这是让连接 conn 把所有发送到数据库的信息都当成 UTF-8 编码格式(当然,前提是数据库默认编码已经设置成 UTF-8)。 然后要注意的是 store 函数。它有两个参数:title 和 content
3、,并把这两个参数加到了一个 INSERT 语句中并用光标执行,然后用光标进行连接确认。这是一个让光标与连接操作分离的好例子; 当光标里存储了一些数据库与数据库上下文(context)的信息时,需要通过连接的确认操作先将信息传进数据库,再将信息插入数据库。 最后要注意的是,finally 语句是在程序主循环的外面,代码的最底下。这样做可以保证,无论程序执行过程中如何发生中断或抛出异常(当然,因为网络很复杂,你得随时准备遭遇异常),光标和连 接都会在程序结束前立即关闭。无论你是在采集网络,还是处理一个打开连接的数据库,用 try.finally 都是一个好主意。 虽然 PyMySQL 规模并不大,
4、但是里面有一些非常实用的函数本书并没有介绍。具体请参考 Python 的 DBAPI 标准文档(http:/legacy.python.org/dev/peps/pep-0249/ )。 5.3.4 数据库技术与最佳实践 数据库技术与最佳实践 有些人的整个职业生涯都在学习、优化和创造数据库。我不是这类人,这本书也不是那类书。但是,和计算机科学的很多主题一样,有一些技巧你其实可以很快地学会,它们可以让你的数据库变得更高 效,让应用的运行速度更快。 首先,给每个数据表都增加一个 id 字段,不会出什么问题。MySQL 里所有的表都至少有一个主键(就是 MySQL 用来排序的字段),因此 MySQL
5、 知道怎么组织主键,通常数据库很难智能地选择主键。 究竟是用人造的 id 字段作为主键,还是用那些具有唯一性属性的字段作为主键,比如 username 字段,数据科学家和软件工程师已经争论了很多年,但我更倾向于主动创建一个 id 字段。这样做的原 因一两句话难以说清,不过对于一些非企业级系统的数据库,你还是应该用自增的 id 字段作为主键。 其次,用智能索引。字典(指的是常用的工具书,不是指 Python 的字典对象)是按照字母顺序排列的单词表。这样做让你在任何时候都能快速地找到一个单词,只要你知道这个单词是如何拼写的就行。 你还可以把字典想象成另一种形式,将单词按照单词含义的字母顺序进行排列
6、。如果你没玩过一些奇怪的游戏,比如危险边缘(Jeopardy)智力游戏,就不能理解游戏的含义,这样的字典就没法用了。但 是在数据库查询的工作里,这种按照字段含义进行排序的情况时有发生。比如,你的数据库里可能有一个字段经常要查询: SELECT * FROM dictionary WHERE definition=“A small furry animal that says meow“; +-+-+-+ | id | word | definition | +-+-+-+ | 200 | cat | A small furry animal that says meow | +-+-+-+ 1
7、 row in set (0.00 sec) 你可能非常想给这个表增加一个额外的键(除了已经存在的主键 id 之外),让查询变得更快。但是,增加额外的索引需要占用更多的空间,而且插入新行的时候也需要花费更多的时间。为了让事情简 单点儿,你可以让 MySQL 只检索查询列的一部分字符。比如下面的命令创建了一个查询 definition 字段前 16 个字符的智能索引: CREATE INDEX definition ON dictionary (id, definition(16); 这个索引比全文查询的速度要快很多,而且不需要占用过多的空间和处理时间。 最后一点是关于数据查询时间和数据库空间的
8、问题。一个常见的误区就是在数据库中存储大量重复数据,尤其是在做大量自然语言数据的网络数据采集任务时。举个例子,假如你想统计网站突然出现的 一些词组的频率。这些词组也许可以从一个现成的列表里获得,也许可以通过文本分析算法自动提取。最终你可能会把词组储存成下表的形式: +-+-+-+-+-+-+ | Field | Type | Null | Key | Default | Extra | +-+-+-+-+-+-+ | id | int(11) | NO | PRI | NULL | auto_increment | | url | varchar(200) | YES | | NULL | |
9、 | phrase | varchar(200) | YES | | NULL | | +-+-+-+-+-+-+ 每当你发现一个词组就在数据库中增加一行,同时把 URL 记录下来。但是,如果把这些数据分成三个表,你就可以看到数据库占用的空间会大大降低: DESCRIBE phrases +-+-+-+-+-+-+ | Field | Type | Null | Key | Default | Extra | +-+-+-+-+-+-+ | id | int(11) | NO | PRI | NULL | auto_increment | | phrase | varchar(200) | Y
10、ES | | NULL | | +-+-+-+-+-+-+ DESCRIBE urls +-+-+-+-+-+-+ | Field | Type | Null | Key | Default | Extra | +-+-+-+-+-+-+ | id | int(11) | NO | PRI | NULL | auto_increment | | url | varchar(200) | YES | | NULL | | +-+-+-+-+-+-+ DESCRIBE foundInstances +-+-+-+-+-+-+ | Field | Type | Null | Key | Defaul
11、t | Extra | +-+-+-+-+-+-+ | id | int(11) | NO | PRI | NULL | auto_increment | | urlId | int(11) | YES | | NULL | | | phraseId | int(11) | YES | | NULL | 名是否正确。 2420 曲线失败。曲线文件名称无效。 2430 错误信息失败。 错误信息文件不存在。 请重新启动控制器。 2431 错误信息失败。 无法打开错误信息文件。 请重新启动控制器。 2432 错误信息失败。 无法获取错误信息文件的标题数据。 请重新启动控制器。 2433 错误信息失败
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 28 排序 为什么 没有 快速