《Python算法教程》——1.2 为什么要读这本书

本节书摘来自异步社区《Python算法教程》一书中的第1章,第1.2节,作者[挪威]Magnus Lie Hetland(赫特兰), 凌杰 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 为什么要读这本书

当我们在工作中使用算法时,通常都是希望能更有效地解决问题、使程序运行得更快,并且让解决方案变得更为简短。但实际情况如何呢?我们获得所需要的效率、速度和简洁性了吗?为什么人们在使用Python这种语言时依然要在乎这些事呢?选择这种语言对于追求高速度的人来说是一个好的开端吗?为什么不选择C或Java这样的语言呢?

首先,可能是因为Python语言本身很讨人喜欢,以至于人们不想换别的语言,或者他们目前也没有更好的选择。但最为重要的可能还是第二点,即在这里,算法设计者们首先要担心的并不是常数级别的性能差异。 即便相关程序完成任务所需要的时间是另一程序的两倍,甚至十倍,但这样的速度可能依然是够快的。况且,那个较慢的程序(或语言)中可能恰好有某些我们所需要的特性,如它可能有更好的可读性。而调整和优化程序在很多时候会非常费劲,其代价是不容小视的。然而,无论选择什么语言,我们都得考虑一下程序自身的弹性问题。也就是说,如果我们将程序的输入量翻倍,会发生什么呢?程序运行时间会是之前的两倍?四倍?还是更多?或者即便增加那么一丁点的输入量也会导致程序运行时间的成倍增长?当您遇到的问题足够大的时候,这样的性能差异显然就不能再靠简单的语言选择或硬件选择来解决了。在面对一个“足够大”的问题(在某些情况下,当问题还没有特别大的时候,它就已经“足够大”了)时,我们能抑制运行时间增长的主要武器就只有——您猜对了——一份扎实的算法设计功底了。

下面让我们来做一个小小的实验,打开Python的交互解释器,并输入以下内容:


《Python算法教程》——1.2 为什么要读这本书_第1张图片

乍看这段代码似乎没什么用处,它只是简单地将一堆数字添加到一个(最初为)空列表中,然后反转该列表而已。但在更现实的情况下,这些数字很可能是来自某些外部数据源(如它们可能是对一台服务器建立的连接),而或许是为了实现最近优先的原则,我们希望这些数字被添加到列表中后顺序是相反的。于是我们产生了一个想法:与其到最后才将整个列表反转过来,何不在数字出现的时候就将它插到列表的头部?这样的话,我们可以将相关代码精简如下(还是同样的解释器窗口):


screenshot

除非我们以前遇到过类似的情况,否则一定会觉得这段新代码看上去很不错。但如果您有机会去试一试的话,就会发现其实速度反而是明显变慢了。至少在我的计算机上,第二段代码完成任务所需的时间大约是第一段的200倍。而且不仅是速度变慢了,其应对问题规模的性能弹性也更差了。我们不妨来测试一下,如将变量count的值由105增加到106。不出所料的话,第一段代码的运行时间应该大约比原来增长了十倍……但第二版的速度则是下降了两个数量级,即它竟比第一版慢了两千倍以上!读者可能已经猜到了,随着问题的规模持续扩大,这两个版本之间的差距只会越来越大。这时候,我们的选择就会比任何时候都要来得重要。

请注意:

这是一个拿线性增长与二次方增长相比较的例子,也是我们在第3章中将要详细讨论的话题。另外,关于向量(或动态数组)的二次方增长问题,读者还可以参考第2章中标题为“list”的黑盒子专栏当中的相关讨论。

你可能感兴趣的:(《Python算法教程》——1.2 为什么要读这本书)