在大型项目上,Python 是个烂语言吗?

276 篇文章 4 订阅
182 篇文章 2 订阅

你去问独孤求败,君子剑和青锋剑哪个好?独孤求败会说,这些不重要,只要技术到了,拈花飞叶皆可伤人。杨过顶,郭靖赞,然而武林中绝大多数人表示:“前辈,哪个门派能招一大拨独孤求败,杨过和郭靖?

是的,有的答主说的对,代码质量最重要的控制变量,是人。然而,当你明确地知道,你们团队的人并不是那么靠得住呢?

所以,我们退而求其次,想想别的方法来控制质量,比如代码死板,千篇一律的java,对程序猿的要求,尤其是用ssh做业务,就低很多了。

所以,Python是不是个坏语言,我不敢说,我也用它来写小工具,不过,如果你做技术选型,别忘了先考虑考虑,你的团队真的能达到“什么工具都无所谓”吗?你的公司开得起那些“什么语言都一样”的程序员的薪资要求吗?

python项目超过5万行,版本3.9.7,类型靠typing、assert和mypy保证,算中型项目吧。写python很容易放飞自我,必须靠一些best practice和principal才能保证代码质量,大项目用python确实有很多潜在危险。

但真正让我头疼的是性能问题,随着功能的增加,我遇到的情况和高赞回答类似:处处都慢,又没办法处处都优化。

我需要在大数据量上做数学计算,操作数据库,提供web服务,驱动selenium做网络爬虫,还需要动态的把mysql里存的python函数动态import到程序中执行(量化交易相关,需要执行交易策略函数,动态import可以解耦交易策略的发布和项目代码本身的发布)。整个项目运行在一台2核4g内存的云服务器上。

很难找到一个比python更好的支持以上所有需求的语言了。

java太耗内存,而且对大数据量的计算也没有优势,python有pandas用起来很爽。

c/c++很吃经验,很多方面都可能导致项目悲剧。搭建一个常见应用至少要涉及到字符集、db连接池、orm、api service、http请求、加密和ssl证书、email一堆基础功能,在java、python、php之类的语言上这些几乎都不会是问题,但c++就可能让人抓狂。

对我自己的项目做了profile,明确了下面几个部分最慢:

  1. selenium、requests,http网络请求慢,这块其实可以容忍,因为我把爬虫拆开成了一些cron
    job定时去跑,还用了multithreading来并行跑多个爬虫,所以速度不太重要。
  2. db模块慢,python orm用的是sqlalchemy,比拼接裸sql语句慢大概10-15倍。但我更不愿意维护裸sql。
  3. json serialization慢,所有数据都用marshmallow serialize为json
    string存db,读写db需要serialize和deserialize,就慢了。我考虑过给所有dataclass手写from_json,to_json
    api来提高速度,这类劳动既容易写bug,又费时费力。
  4. python本身天然比c/c++慢100-150倍。

目前第2、3、4点是我想优化的重点。

—————更新—————

尝试了用rust重写一部分功能,pyo3编译为python module。pyo3还支持从rust调用python。rust的语言特性非常fashion,而且很多功能都可以找到第三方库来实现,似乎看到了直接用rust重写整个项目的希望。

—————更新2—————

  1. 经过了几天的各种尝试,不得不说,最终还是回到了c++重写部分模块的路上。有几点原因:对rust的积累没有c++那么深,从学校开始看各类经典c++书籍、stl和开源项目的源码,我对c++更如鱼得水。而rust的生命周期管理对心智负担还是太重,导致实际上rust开发进度比c++慢很多。
  2. cargo确实好用,但我对cmake工具链也足够熟悉,目前还没遇到无法解决的问题。关键最近找到了一个新的c++
    orm库,因为之前放弃c++转向rust的主要原因是c++ orm劝退。
  3. rust很多第三方库在github、stackoverflow上的讨论不多。相信很多人像我一样,不打算深入源码中解决问题,如果google两天还无法解决问题就劝退了。
  4. c++比rust更加亲和python。比如rust enum无法直接转化为python
    enum,rust没有class继承机制、没有函数重载、默认参数机制,导致一部分rust api不适合转化为python
    api,进一步导致要多写很多wrapper代码。而我极度抗拒这类“重复劳动”。

—————更新3—————
已经用pybind11重写了几个公共的基础模块(环境变量、时间日期等),ubuntu 20/gcc 9.3开启c++17(刚好pybind11对optional有特定依赖),只能说真香。本地unit test和regression test时明显速度变快,内存占用也明显降低。

目前正重写db模块,之前让我一度放弃c++转向rust的关键原因就是没有满意的c++ orm(rust有desiel)。试过odb、soci之后,发现了sqlpp11。

  1. 我极度不适应odb的#pragma语法,耐着性子看了大半天文档也没找到怎么定义column
    name,不想浪费时间。soci的api很友好,但homebrew的默认安装不支持mysql
    backend,我用brew源码安装也没成功(github上提了issue说无法reproduce可能我本地环境有问题)。
  2. 我又直接git clonesoci源码下来也没编译成功。生产环境ubuntu上apt安装倒是没问题,但考虑到开发环境配置失败,就放弃了。最后找到了github上star数很高的sqlpp11,文档简陋但足够用,实现也相对简单,是个轻量级的库。
  3. head only免安装,api非常友好,对我足够用(我只要普通CRUD就行),关键本地终于跑起来了demo,就果断选择了sqlpp11。

最后,作为一个IT的过来人,我分享的都是一些自己的学习经历和干货。还有一下写整理的一些 Python干货可以领取哦

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值