科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件如何使用Python迭代工具模型

如何使用Python迭代工具模型

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们基本理解了Python之后,可以继续深入挖掘Python标准库来学习如何微调函数。本文我们将通过几个例子向大家介绍如何使用Python迭代工具模型。

作者:开发者在线 来源:开发者在线 2007年8月2日

关键字: Nick Gibson 迭代 python

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共19页)

我们基本理解了Python之后,可以继续深入挖掘Python标准库来学习如何微调函数。本文我们将通过几个例子向大家介绍如何使用Python迭代工具模型。

我们已经介绍过如何使用表推导式和生成器来迭代一个序列而不用一次全部计算的基础知识。利用迭代工具可以简单快速执行一些列表上所需的更为复杂的操作。我们将介绍模型提供的一些函数并编写几个小函数用来压缩和打包列表。

Compress()

让我们从一个简单地删除列表中所有连续复制的函数开始。一个初始化代码可以如下所示:

def compress(seq):

result = []

for i in range(len(seq)-1):

if seq[i] != seq[i+1]:

result.append(seq[i])

return result

这是一个相当标准的迭代解决反方案,该方案利用Java或.NET很容易的编码实现并可以认为是解决迭代的作好方法。让我们通过对一个有大量元素的列表进行压缩试验压缩函数,以此快速地测试一下它的性能。

>>> long = [random.randint(0,50) for i in xrange(2000000)]
>>> i = time.clock(); q = compress(long); print time.clock() - i;
2.11

首先,我们构造一个有200万个0到50之间随机元素的列表,然后分别在对它压缩的前后检查数据块。在我的机器上这个过程花费了大约两分多秒的时间,不是很差。

虽然看起来并不能准确预言什么,但是可以明确的是存在一种更好的实现方法。让我们试验用表推导式和内建的zip()压缩函数完成同样的任务。如果你不熟悉zip压缩工具,下面是它的行为:

>>> zip(['a','b','c'], [1,2,3])

[('a', 1), ('b', 2), ('c', 3)]

我们的第二个压缩函数如下所示:

def compress2(x):

return [a for a,b in zip(x, x[1:]+[None]) if a != b]

这里我们使用的技巧是创建一个数对,每一个包含列表中的两个连续元素。然后,只要列表中的第一个项目与第二个项目不同,每个数对中将包含列表的第一个项目。这肯定会更短,更清晰,但是性能是如何改进的呢?

>>> i = time.clock(); q = compress2(long); print time.clock() - i;
8.31

不幸的是构建数对列表的代价非常大,原因很明显,有200万个项目的列表现在变成了200万对项目。我们真正想要做的是一个一个的生成数对列表。我们可以编写一个看似zip函数的生成器,但既然在Python的迭代工具模型中已经给我们提供了一个函数:izip(),因此我们可以使用编写了。使用izip可以这样编写压缩函数,如下所示:

from itertools import *

def compress3(x):

return [a for a,b in izip(x, x[1:]+[None]) if a != b]

这个确实更好吗?

>>> i = time.clock(); q = compress3(long); print time.clock() - i;
0.76

是的,这个更快,更清晰,而且使用更少的内存。

Pack()

我们可以将这种方法用于其它函数吗,比如打包函数pack?Pack函数功能是获得一个列表并将连续元素拆分成子列表。Pack函数功能如下所示:

>>> pack([1,1,2,3,4,4,1,1,2,2,3])
[[1,1],[2],[3],[4,4],[1,1],[2,2],[3]]

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章