从拨号下载28兆到支撑AI时代:我装了20年Python,终于明白它为什么赢了
- 2026-10-04 07:45:11
2008年冬天,我在一台奔腾4电脑上装Python 2.5。安装包28兆,拨号下载花了四十分钟。装完打开命令行,输入print 'hello',屏幕跳出五个字母。那一刻我没觉得这东西会改变什么。当时用C写一个链表要三十行,Python三行就够。很多人说这语言太慢,像玩具。玩具就玩具吧,能跑起来就行。
Python的语法干净到有点极端。缩进不是建议,是强制。刚上手的人经常被空格和Tab搞疯。一个Tab在编辑器里显示四个空格,解释器有时候不认。这件事吵了十几年,直到Python 3彻底禁止混用。我见过一个同事因为缩进错误排查了两个小时,最后发现是复制代码时带了全角空格。他骂了一句,把键盘摔了。第二天还是继续写。这语言就这样,你恨它某一点,又离不开它整体。
真正让Python翻身的不是语法,是那些人写的库。NumPy把数组计算从C语言里解放出来。Pandas把Excel那套操作搬进代码。Requests库用三行代码发一个HTTP请求。Django和Flask把网站后台变成搭积木。这些库不是官方做的。是散落在世界各地的人,下班后花时间写出来的。他们不拿钱,就图个方便。写完了扔到PyPI上,别人pip install就能用。这种模式后来被很多语言学,但学不像。因为Python社区有一种奇怪的默契:你写的东西再烂,只要解决了实际问题,就有人用。
说到pip,这个包管理器本身是个传奇。早期的easy_install像一场灾难。装一个包能把你环境搞崩溃。pip出来之后慢慢好起来。现在的pip能处理依赖冲突,能建虚拟环境。但虚拟环境这件事还是绕。venv、virtualenv、conda、pipenv、poetry,五种方案五种逻辑。新手问该用哪个,老手回答看你项目。这种回答很混蛋,但事实就是如此。没有标准答案,因为Python从来就不是一个设计出来的语言。它是长出来的。
Python 2到3的迁移是另一段历史。2008年发布Python 3,到2020年才彻底停止Python 2。十二年。很多公司拖到最后一年才动手。为什么拖?因为代码太多,人太少。一个二十万行的项目,改print语句就要改几千处。有人写了个工具叫2to3,自动转换。转完还得手工修。那几年招聘要求上经常写“有Python 3迁移经验优先”。这经验说白了就是耐心。跟技术关系不大。迁移完了回头看,Python 3确实更好。Unicode处理干净了,异步语法加进来了,类型注解也有了。但过程很苦。很多人在这过程中换了语言。
类型注解是近十年最大的变化。以前写Python,函数参数是什么类型全靠文档和注释。现在可以写 def add(a: int, b: int) -> int。注解不强制检查,运行时忽略。但配合mypy这类工具,能在运行前发现类型错误。大项目里这个太重要了。我见过一个团队,二十万行代码全靠类型注解撑着,不然没人敢改。改一个函数,mypy跑一遍,哪里调用不对全标出来。这比写单元测试快多了。当然有人反对,说Python就该动态,加类型是倒退。这种争论没有结果。各用各的。
异步编程是另一个分水岭。asyncio在3.4加入,语法在3.5变成async/await。写网络服务的人终于不用开几百个线程。一个事件循环处理上万连接。Tornado早就在做这件事,但asyncio成了标准。FastAPI用它把接口性能拉高一个档次。我试过用一个进程处理两千个并发请求,内存只用了八十兆。换成多线程版本,内存直接上G。这不是理论,是跑出来的数字。异步代码写起来别扭,所有调用链都要async。漏一个就报错。习惯之后还好。调试麻烦点,但能用。
Python在数据领域的地位不用多说。Jupyter Notebook改变了很多人写代码的方式。一段一段跑,结果直接显示在下面。图、表、公式混在一起。做分析的人不用来回切窗口。我认识一个生物学家,她不会写循环,但能用Pandas做基因序列比对。她说这就像用Excel,只是公式换成函数。这种降低门槛的事,Python做了很多。有人批评说Notebook不可复现,状态乱。对,但让一个不写代码的人开始写代码,这件事更重要。先跑起来,再谈工程化。
机器学习框架选Python不是偶然。TensorFlow第一版是C++和Python混写,后来发现用户全在Python层。PyTorch干脆以Python为主。为什么?因为研究员要快速试错。一个想法从脑子到代码,Python花十分钟,C++花一天。这差距决定了一切。训练慢可以加GPU,写代码慢没救。现在连部署都在用Python。ONNX、TorchScript这些工具把模型转成C++能跑的格式。训练用Python,推理用C++。分工明确。
Python也有硬伤。GIL让多线程没法真正并行。CPU密集任务只能用多进程。多进程之间传数据要序列化,开销大。这个坑很多人踩。写个爬虫开十个线程,发现比单线程还慢。因为GIL锁着,线程切换白费功夫。解决办法是用asyncio或者multiprocessing。选哪个看任务。IO多用asyncio,CPU多用multiprocessing。记住这个,少走弯路。
性能问题一直有人提。PyPy用JIT把速度提了五倍。Cython让你写C扩展。Numba把数值计算编译成机器码。这些工具都在。问题是大部分项目根本不需要。一个网站后端,瓶颈在数据库不在Python。一个数据处理脚本,跑一次三分钟,优化到一分钟不值得。性能优化要花在刀刃上。过早优化是浪费。这句话在Python社区特别对。
最后说一个现象。很多人用Python好几年,还是只写脚本。不碰类,不碰装饰器,不碰生成器。这没问题。Python本来就是脚本语言出身。你用它把重复工作自动化,把数据整理清楚,把网站搭起来。这就够了。不需要成为专家。那些高级特性,用到了再学。用不到就不学。我见过太多人卡在装饰器上,其实他们根本不需要写装饰器。调用别人的装饰器就行。理解概念,能看懂代码,足够。
学Python最好的方式是做一个真实项目。不是刷题,不是看视频。找一个你每天手动做的事,比如整理下载文件夹,比如批量改图片尺寸,比如抓取某个网站的价格。写代码把它自动化。遇到报错就搜。搜不到就问。问不到就绕。绕不过就换方法。这个过程里你学到的东西比任何教程都多。因为你有目标。你知道为什么写这行代码。这比为了学而学强一百倍。
Python三十年了。从邮件列表里的小项目变成今天的样子。没变的是一件事:它始终是给人用的。不是给机器,不是给论文,不是给标准委员会。是给坐在电脑前想解决某个具体问题的人。语法简单也好,库多也好,社区大也好,都是为这件事服务。你打开编辑器,写几行,跑起来,看到结果。这个循环越短,你越愿意继续。Python把这个循环缩得很短。短到很多人忘了它背后有多复杂。
你最近用Python做了什么?是写了个小工具帮自己省时间,还是在处理一堆数据?有没有哪个报错让你想砸键盘,最后又笑着解决了?来评论区说说。不用长篇大论,一句话就行。