【在主画面加入捷径】
       
【选择语系】
繁中 简中

技术杂谈:为什么要 (或不要) 用 Python 实现数据结构和算法

【赞助商连结】

    笔者最近在国内某程序讨论区上看到一则有关数据结构的问题,原楼主是某个资讯科系的学生,因为对数据结构的实现不熟而苦恼。原先该网友使用 C 语言,而有些网友建议原 po 改用 Python,这时候引起正反两方的一番论战,笔者在这里就不重覆论述其过程。其实重点并不在于要不要用 Python,而是为什么要 (或不要) 用 Python。

    首先,程序语言并不是像江湖武术般,非黑即白、有我没你,另投他门就是罪该万死。在某个时机点,A 语言可能会是最佳解 (sweet spot),但在另一个时间点,同样的语言却显得杀鸡用牛刀。TensorFlow 表面上是 Python 套件库,但内部是由 C++ 撰写,再透过 C 提供 Python (和其他高阶语言) 的接口。同样地,LibXML2 本身以 C 写成,在 Python 包成 lxml,在 Ruby 则包成 Nokogiri。我们会用 C (或 C++) 写其他高阶语言的延伸套件,但不会直接用这两种语言写脚本,因为不同语言有其合适的使用时机。

    那么,我们为什么会用 Python (或 Ruby 或其他高阶语言) 实现数据结构和算法呢?即使算法正确,用 Python 实现的实用性相对偏低。不过,我们仍然可以看到一些用 Python 实现数据结构或算法的书,像是 Data Structure and Algorithmic Thinking with Python (CareerMonk Publications, 2015) 等;良葛格也在其网站上用 C、Java、Python、Ruby、JavaScript 等多种语言展示相同的算法,表示英雄所见略同。算法是让电脑程序更有效率的方法论,本身和特定的程序语言无关,不论是 Python、Ruby 或其他的高阶语言,都可拿来做为练习的工具。使用 Python 这类较高阶的语言,可以减少因语言本身的特性所造成的错误,专注在抽象思考上。

    不过,如果自己的工作和资讯相关,最好还是要学一下 C (或 C++)。虽然用 Python 或 Ruby 或其他高阶语言写程序很舒服愉悦,我们有时还是会碰到一些效能瓶颈的部分,这些部分还是得回头用 C (或 C++) 来写。即使不直接用 C 写程序,有一些 C 的知识还是会有帮助,像是在安装一些高阶语言的延伸模块时,背后实际上仍是某些 C (或 C++) 所写的程序在运作着,这时候相关的背景知识就会有些帮助。即使使用像 Rust 这种新兴语言,要和其他语言合作时,仍需提供 C 的接口,这时就会间接用到 C 的知识。

    由于以 C (或 C++) 撰写程序需要程序设计者的专注和自律,后来有一些新兴的编译语言试图简化这些苦工,像是先前的 D 或是近年来的 Go (golang) 和 Rust。这些语言并没有取代 C,仍然提供 C 的接口;但以这些语言撰写程序,会比直接用 C/C++ 来得简单。在这些语言中,Go 由于简洁的设计和良好的工具链,在国外相当地风行;而 D 和 Rust 各有一些支持者。程序语言试图在效率和易用间取得一个最佳的平衡点,每个语言的设计哲学不同,使其使用情境相异。

    使用那种语言实现数据结构和算法没有绝对的对错,而要想想为什么在这个当下要用 A 语言而非 B 语言。当自己清楚个中缘由后,就不需落入网络上的口水战了。

    【赞助商连结】