[编程开发] 为什么会有程序员不喜欢 Python?

[复制链接]
anthrax 发表于 2023-10-4 18:04:17|来自:中国 | 显示全部楼层 |阅读模式
最近发现有不少人不喜欢Python的, 我以前一直以为只要接触过Python的都应该很喜欢Python吧?
全部回复5 显示全部楼层
renhekeji 发表于 2023-10-4 18:04:33|来自:中国 | 显示全部楼层
  1. def outer(*args, **kwargs):
  2.     # ... Some complicated logic ...
  3.     tmp = inner(*args, **kwargs)
  4.     ...
复制代码
我看到这种东西就头疼
偏偏有数不胜数的知名Python类库这么设计,害我必须去看文档
这是我不喜欢Python的诸多原因中很小的一点

直到现在Python出了TypedDict并加上了Required和NotRequired,针对这种情况还没有什么良好的解决方案。因为Python中给**kwargs: xxx的这个xxx其实表示的是Dict[str, xxx]中的那个xxx,也就是说Python的type hints目前还没有办法给**kwargs标记键的类型。我理解Python是为了崇尚简洁这么干,但这真的有点弱智了。
目前一个折衷的方案是用个data class,在outer里加个options,类型标记为这个data class,而inner接收这个data class。但是如果有多层这样的调用,用data class很不现实,还是要回到*args, *kwargs这个逆天模式上来。
要么就是类库开发者辛苦一点,给每个函数都把参数列表完整写一遍,天哪……
不知道什么时候能向隔壁TS学学。
我是色狼 发表于 2023-10-4 18:05:04|来自:中国 | 显示全部楼层
Python被误解到不喜欢的原因

分析“为什么Python不受喜欢”这个命题时的大部分回答我都大致看了一下,其实大部分Python的回答还是一知半解甚至是曲解的,没去深入了解Python,将Python和CPython划等号这种错误认知其实是不可取的。
Python之所以会被部分程序员误解甚至到了不喜欢的地步。这个锅甩给下面两种,我都认为不过分

  • 国内一些Python培训机构过度吹捧,拿AI、大数据开发为广告噱头培训这些忽悠小白学完Python可以高薪就业或转行,但事实上并非那么简单。
  • 部分Python业内人士感到很尴尬而且看不下去的就是“Python魔怔”、“CPython吹”这两类极端的Python用户不论什么技术只要該技術用於改善CPython性能的就不理智地往CPython身上贴金、说成CPython好高级,好“犀利”。典型的“强盗逻辑”执行者,比如CPython3.10刚出那会“CPython吹”将PyJion冷饭再热炒的做法,明明是一个外挂JIT非要说成内嵌CPython内核的JIT,殊不知我一个性能测试令,PyJion性能比原来CPython去跑测试代码还要慢(看這裏),所以我很厌恶CPython吹罔顾事实给Python招黑的做法。


  • 比如说"Python比C/C++快"这个是知呼上曾经吸引流量的梗,真正对Python有所了解、有些资历的C/C++程序员想必到了解过,某两位答主(我就不点名了,下面提供的帖子感兴趣自行区翻以下,Python圈内从业者都知道是谁)。为求吸粉博眼球,误导他人的“强盗逻辑”作为,我对他们不与苟同。简直令到大部分写C/C++程序的从业者大为颜汗和尴尬,他们还招来不少骂声。
  • 比如不是CPython官方原生的技术,非要将第三方的C技术栈往CPython身上靠说成CPython自家的东西。以此误导其他一知半解的新手程序员,达到吸粉割韭菜目的。
上面提到这些令到Python背付骂名,被误解到了不喜欢的奇葩现象,我下面这贴都剖析的很清楚
Python是不是被严重高估了?何为CPython吹

對Python生态中的其他第三方Python实现、其他改善CPython短板的性能加速方案不了解、或者知道绝口不提却要说成CPython原创的技术,以此为噱头错误引导其他Python新手,达到吸粉敛财的目的”,误人子弟来说CPython吹一点都不为过。
Python卖课这种变现方式无可厚非,但请不要通过“CPython吹”的方式来进行。做到为学员负责让学员对Python就业现状有个整体并正确的了解。我呼吁一句:“部分Python讲师爱财,要取之有道,Python被搞臭了对你们也没任何好处”。
Python生态工具分布

从编译Python代码提升执行效率的角度,可以将常用的第三方Python技术栈做大致如下的分类,笔者对【Python】、【Python实现】和【Python编译器】这些概念会严格区分。

  • Python:视为软件生态时,它涵盖除CPython外见下图,所以 Python ≠ CPython


Python实现

实现Python代码到字节码序列化、解释、执行对应操作码匹配的一系列CPython内核函数、以及Python对象的内存管理和垃圾回收等特性。但这里简单关注如下几点:特性1、特性2、特征3

  • 特性1:兼容CPython语法规范。

    • RPython从CPython语法规范来说,禁用CPython任何动态特性,它仍然被视为一个Python实现的特殊子集。
    • Cython除了完全兼容CPython的语法特性,增加了C/C++的数据类型、对应C/C++库常用函数封装,因此Cython是CPython、RPython的超集。

  • 特性2:对Python代码可以具备即时编译或静态编译行为,最终将Python代码编译为机器码。并通过cffi函数接口分配可执行内存执行编译后的机器码。

    • RPython、Cython属于静态编译的工具、PyPy是一个即时编译器(笔者统称叫Python编译器)

  • 特性3:对Python代码序列化成字节码,在运行时通过Python虚拟机主循环读取字节码并解释对应操作码并执行CPython内部后续有一系列繁琐低效的操作(这里扯到CPython内核原理,详见这里),该行为跟编译行为有所区别。直到目前的CPython3.11严格来说,只能叫解释器不能叫Python编译器。
Python编译器


  • 只满足特真2不满足特征1、特征3。不叫Python实现,比如Nuitka、Numba、Cppyy、Pybind只归类为编译工具。
  • 而PyPy、Cython、RPython可以视为Python实现也可以作为Python编译器。
备注:满足特征1和特征2其实已经可以将Cython、RPython定义为一门编程语言。
理性看待CPython

强制缩进问题

我自己对CPython也有不喜欢的地方,就是广为诟病的强制缩进问题。以前老版本的有第三方的插件braces可以让Python用户在Python代码上下文使用大括号替换强制缩进,后来后续的CPython屏蔽了该插件。但guido(戏称:“龟叔”)的偏好他认定“强制缩进”是最有美感的。而且也是他专横要在Python语法规范中所强推的


你有什么办法呢,那我的做法就是在对应的作用域结束的地方自行添加注释行做标记(如下图)


另外的做法是pip install Bython这个库,可以实现这样的带javascript的编程风格
  1. def print_message(num_of_times) {
  2.     for i in range(num_of_times) {
  3.         print("Bython is awesome!");
  4.     }
  5. }
  6. if __name__ == "__main__" {
  7.     print_message(10);
  8. }
复制代码
点解CPython被调侃为“调包工具”?

你不能一刀切地认为Python系调包语言。因为一旦提到“跑Python代码”这种命题,你要区分CPython、PyPy、Cython等不同的Python实现去跑Python代码会知道非常大的性能差距。用“CPython单纯跑Python代码就是调包”这个说法大体上没错,因为直到目前CPython3.11不存在内置的JIT和额外的静态编译机制,但PyPy、Cython去跑的Python代码就不能说是调包。因为这些原因


  • 对于PyPy来说,它除了对Python代码解析为Python字节码之外,还会代运行时的Python代码上下文做JIT编译和C级别的代码优化的。对比一下java,为什么没有人去调侃jvm是掉包的java实现!?,因为跑jvm有内置的JIT编译器在对java代码在性能优化上干实事,同样PyPy本身有内置JIT在Python代码做类似的优化操作
  • Python要获取接近C代码执行速度,Cython即在编译阶段之前是强制对Python代码中的变量、函数参数、返回值进行C级别的静态数据类型绑定
  • Python开发者,可以自行用Cython内置的C/C++函数接口去替换低效的Python代码实现,或你自行实现相同逻辑的cython代码。
大型的项目,即便选择Python作为解决方案,用在高并发、运算任务繁重的场合很多不会单纯用CPython去跑的。GIL、threading的死锁问题、单一的引用计数的内存垃圾回收都是CPython要一直要去解决的问题,即便没用过CPython的其他程序员都有所耳闻。而开发中的3.12可能会给CPython带来重新变革,可以说“若3.12这一版没有下大力气去正视并付诸行动解决这些悠久以来被诟病的问题,那可以肯定地说CPython后面就没有未来可言!
要一洗CPython以往背付的骂名至起码CPython 3.12能给出一个类似PyPy像样jit内核。
追求高性能的Python应用场景是离不开第三方的Python技术栈的的后端支援的,真正深耕Python领域应该都知道,Python生态中有很多保姆级的加速工具。这些第三方工具其实都是C语言家族的技术栈,跟CPython官方没什么关系的。

  • nuitka:一个可以将Python代码编译成C++代码的高性能打包工具
  • cython:一个高性能的并且完全兼容CPython的编译器框架,而且Cython是事实上跟C/C++一起支撑整个Python C扩生态的发展的主力语言之一。它对pypy兼容性也不错。
  • pypy:高性能的Python实现,PyPy内核自带JIT,而且也是事实上的Python编译器
  • rpython:一个类似cython的编译行为,属于pypy源代码附带的一个编译框架。pypy的jit内核就继承自rpython的jit源代码。它能将符合rpython语法限定的Python代码完全做到C代码转换,能够编译出完全脱离Python,可独立执行的C程序。
  • numba:数据科学领域的的JIT编译器,对包含C基本数据类型注解的函数、Python类定义,JIT编译后的加速效果十分显著,我测试过比PyPy快4~5倍。
  • cppyy:一个兼容PyPy类似Pybind的C扩展打包工具。
  • pybind:对接CPython,能将C++代码快速到包成C扩展的打包工具。
其中想深入了解nukita技术的可以到下面这个答主的文章,翻ta的主页。
解读Python3.12的加速与JIT而笔者的专长是深耕Cython、PyPy和C++这些编程技术。
Cython/PyPy编程技术C/C++ 修道院CPython当前有很多诟病的地方还没解决,但从2.7到现在3.11它的执行效率其实一直都在改善,但仍未达到体量大的商业项目中大规模部署原生Python代码的程度。CPython本身缺少类似PyPy有覆盖整个Python上下文jit编译器。
但CPython仍然可以借助第三方的技术栈实现性能加速进而达到商业应用的目的的。
1.运算密集型多任务并行会选择cython。而不是多进程CPython.
2.繁重的生产业务逻辑统统都可以丢给Cython去做代码重构和静态编译
3.并发的IO应用场景会保留给CPython原生的Python代码的业务逻辑。这是CPython能胜任的事情
wuyou008 发表于 2023-10-4 18:06:02|来自:中国 | 显示全部楼层
我接手过一个python项目,作者已经离职,没有文档,没有类型标注,所有引用关系都靠全局文本搜索,然后连蒙带猜。公司设想是把它改一改,变成新系统的一个微服务,但一堆大几百行的py文件,参数都是kwargs,数据结构都是 dict,根本搞不清变量传递了什么,返回什么,更不要说nullability这种高级问题了。
我照着原代码重写了几个模块,感觉比重用原来的代码还简单。
不久我也辞职了。
zah1111 发表于 2023-10-4 18:06:53|来自:中国 | 显示全部楼层
嗯。现在的小朋友都是深度学习流行之前出生的吗??
在深度学习流行之前,Python是一种脚本语言。。啥叫脚本语言。打个比方:就是瑞士军刀。。你说瑞士军刀好用么??其实挺好用的。但是你要是用它来挖战壕。估计士兵会骂人吧。。。
很多程序员的工作场景是需要长期维护的软件系统。。构建这种东西,不能用Python。。但是如果你是一个科学家。对于编程没啥经验。拿Python来描述你的算法。挺好用的。。
就是这样。。
defiler 发表于 2023-10-4 18:07:26|来自:中国 | 显示全部楼层
我也很喜欢用 Python
但是
你闲的蛋疼么……

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则