选择 Python 作为 AI 基础编程语言

选择 Python 作为 AI 基础编程语言

人生苦短,我用 Python

人们做一件事往往出于或多或少的利益。就比方讲,义务教育提倡学生学习英语,可能因为英语是全球最通用的语言,如果学会英语的听读写,遇到需要英语交流的地方自然不在话下。那说到 AI 这一行,选择何种编程语言也不例外。下文将侧重从 Python 的几个主要优势展开,讲述为何 Python 适合作为 AI 的基础编程语言。

太长不看版:

  • Python 是开源、免费的编程语言,力求普及和高效协作。
  • Python 语法简洁明了,写起来更省事,读起来也更方便。
  • 得益于自身的特性,Python 成为从事数据处理和机器学习人员的首选。
  • 已有的 AI 支持库让开发者无需关注底层,而只需把重心放在实现上,开发效率明显提升。


I. 编程语言之争:Python 的定位

Python 的战略定位是什么?其实很简单,就是要做一种免费、简单易用却又专业严谨的通用编程语言,或者叫胶水语言。期望普通人也能轻松容易地上手,把各种基本的程序元件拼装在一起,并且保证协调运作。

然而Python并非生来就是AI编程的首选。从 1989 年底 Guido 缔造这一语言开始,到机器学习正式崛起的 2013 年的二十几年间,Python 并没有成为 AI 研究员的一把扳手。但凭借其出色的特性,而后在几年 AI 呈现井喷的态势下,迅速就抓住了人们的眼球和持续关注。如今就连非从事技术人员都在问,“ Python 是什么?”

T1. 几种 AI 编程语言部分特性比较
编程语言 免费 社区活跃 快速开发 语法简约 面向可视化 学习曲线
C++ 陡峭
Java 一般
Matlab 陡峭
R 一般
Python 低缓

除 Matlab 属于付费性质外,其余编程语言都是免费使用。从成本的角度考虑,多数公司会倾向于选择免费可靠者。R 在统计应用领域占有一席之地,然而普及率不及另外几门语言。实际上,C++ 、Java 和 Python 是 AI 开发最常用到的三门语言。


II. 表达方式:简约易懂

假设一个例题,

已知 x * y = 32,x 和 y 都是正整数,且 y 为 x 的两倍,试求 x 和 y 的值。

不考虑解方程的效率,可能的实现方式如下(关键代码):

  • C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# include <iostream>
# include <math.h>
using namespace std;
int main(){
double x, y, z;
// found 用于标记是否解出方程
bool found = false;
z = 32;
// 利用循环暴力解题
for(double i=1; i<sqrt(z); i++){
x = i;
y = 2 * x;
// 若找到方程的解,且误差在接受精度范围内,输出结果
// 误差精度为 0.01
if(abs(z-x*y) <= 1e-2){
cout << "The answer is: x=" << x << ", y=" << y << "." << endl;
found = true;
break;
}
}
/// 否则输出范围内无解信息
if(!found)
cout << "Not found! Try a larger range." << endl;
return 1;
}
  • Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
public static void main(String[] args) {
double x, y, z;
// found 用于标记是否解出方程
boolean found = false;
z = 32;
// 利用循环暴力解题
for(double i=1; i<Math.sqrt(z); i++){
x = i;
y = 2 * x;
// 若找到方程的解,且误差在接受精度范围内,输出结果
// 误差精度为 0.01
if(Math.abs(z-x*y) <= 1e-2){
System.out.println("The answer is: x=" + x + ", y=" + y +".");
found = true;
break;
}
}
// 否则输出范围内无解信息
if(!found)
System.out.println("Not found! Try another range.");
}
}
  • Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# found 用于标记是否解出方程
found = False
z = 32
# 利用循环暴力解题
for i in range(1, int(z**0.5)+1):
x = i
y = 2 * x
# 若找到方程的解,且误差在接受精度范围内,输出结果
# 误差精度为 0.01
if(abs(z-x*y) <= 1e-2):
print("The answer is: x={}, y={}.".format(x,y))
found = True
break
# 否则输出范围内无解信息
if(not found):
print("Not found! Try a larger range.")
  • 运行结果:
1
The answer is: x=4, y=8.

简单解读一下解方程的代码:

我们给定范围1~根号z(z为32),让计算机通过不断举出范围内的每个整数,并通过式子z - x * y(x为范围内整数,y是x的2倍)判断是否解出方程——若满足小于 0.01 ,方程解出,输出 x 和 y ,否则输出“未在范围内找到方程的解”。

计算机求解未知数的本质是运用穷举法。穷举法的求解效率依赖问题本身的规模大小和计算资源的多寡,因此我们常接触到的求解器大多经过了算法(逻辑上的)优化。此例为未经优化的代码。

从上往下看,Python 的代码量是三者中最少的,在开发方面一定程度上减少了代码的维护成本。另外,无论是range(范围)print(打印)not found(未找到)这些极为贴近人类语言的描述,还是类似z = 32这样简洁了当的描述,Python 的代码都足以给人一种更亲近的感觉。而其他编程语言的语法稍显啰嗦,在无形之中增加了理解的负担。

T2. 几种编程语言部分语法比较
举例 C++ Java Python
声明变量(基本类型) bool isPrime = false; boolean isPrime = false; is_prime = False
声明变量(容器 std::vector<int> nums = {1, 2, 3}; Vector nums = new Vector(3);
nums.add(1); nums.add(2); nums.add(3);
nums = [1, 2, 3]
定义函数 bool isPrime(int num){ ... } boolean isPrime(int num){ ... } def is_prime(num): ...
使用库 # include <math.h> import java.lang.Math import math
调用库函数 std::sqrt(num); Math.sqrt(num); math.sqrt(num)

Python 给人以一种更像是“用尽可能直接简单的方式把事情做了”的感觉。

III. 巨人肩膀:丰富强大的资料库

做机器学习和深度学习必然躲不开数据处理。Python 就有许多擅长处理大量数据的库,例如 NumPy 和 Pandas, 这两个库都做了并行化处理来提高运算效率。配合自带的容器类型list、set、dict,数据的处理更加方便、快捷。

站在巨人的肩膀上,可以帮助我们望得更远。感谢那些辛勤的贡献者, 我们可以不需要关注算法在底层是如何实现,而只需把工作重心转移到业务的层面上。这么一来, AI 项目的开发效率自然就提升上去了。夸张点讲,好比是用硅和金属和用电子元件制造出一台计算机的差别。

T3. Python 部分 AI 支持库
用途 模块
图像处理 PIL, SciKit-Image
文本处理 NLTK, JieBa, SnowNLP
科学计算 NumPy, Pandas, SciPy
机器学习 SciKit-Learn, TensorFlow, PyTorch
可视化 MatPlotLib, Seaborn

开源社区的理念,驱使无数与 AI 相关的爱好者和研究人员贡献自己的智慧,让功能代码不断得以复用、完善和扩展。愿你在汲取养分,飞速成长的同时,献出你的才华来反哺开源社区,让它变得更加美好。


IV. 写在最后

总的来说,Python 是一种能让学习代价最小化的同时,将脑中想法尽快翻译成代码的载体。然而,编程语言无非只是一种工具。工具在于用,若非立志成为代码诗人或者语言大师,切忌过多琢磨!


延伸阅读


# AI, Python

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×