最近研究 python 的一个小失落

2016-08-01 08:02:33 +08:00
 SlipStupig

python 有一个很-O 选项我一直很好奇这个选项是干嘛的, help 写的是:

 -O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x
-OO    : remove doc-strings in addition to the -O optimizations

python 优化选项可以产生更小的 bytecode 文件,我试着选了一下,确实小了一点,但是对性能提升并没有什么用,后来看官方邮件是这么回复的:


> Py_NoSiteFlag = 1...assuming you don't need to load site.py 
>
>     for example:</br>
>
> extern int Py_OptimizeFlag;
> extern int Py_NoSiteFlag;
> ...
> if( !Py_IsInitialized() ) {
>     Py_OptimizeFlag = 2;
>     Py_NoSiteFlag = 1;
>     Py_Initialize();

最后结论是 python 优化选项并没有什么用,想加速换 pypy

30898 次点击
所在节点    Python
268 条回复
aisk
2016-08-01 23:30:15 +08:00
@serial 看到脚本喷性能,看到性能快的喷开发效率,反正怎么也不和心意。那好吧,给你个动态语言的高性能实现, v8 / node 咋样?你又喷人家回调代码可读性差。那好,给你最新的 es ,有 async / await ,解决回调嵌套的问题,你又喷增加理解难度, class 关键字破坏原型链继承的纯洁性。那来个 google 的 go 语言如何,性能也不错,抽象程度也比较高,还全程异步 IO 效率高。结果呢,你又嫌人家没泛型,异常处理又啰嗦。那来个随大流的 Java 如何,全球很多大公司都在用,这回不会错了吧,但我知道你一定嫌弃 Java 语法太啰嗦不容易玩出花儿来,还是 oracle 家的产品,吃枣药丸。那给你世界上最好的语言 PHP 如何,我猜您一定会说,切,连操作系统都不能写,好意思说自己是编程语言么?
aisk
2016-08-01 23:36:55 +08:00
再分享一个 @serial 的“高论”:

> serial 2 小时 12 分钟前
图形是显示在 GUI 平台上的。 Linux 都没有 GUI ,发行版都是提供自己的 GUI 库。 nodejs 惯例显示在浏览器,浏览器已经有 canvas 和 webgl 图形库了。

我已经笑出腹肌了,“ nodejs 惯例显示在浏览器”是什么鬼?“ Linux 没有 GUI ”又是什么鬼?当然你非要扯 Linux 内核没 GUI 的话,那你这个强行装 X 我服。另外 nodejs 为何不需要图形处理库?人家 PHP 主要拿来做网站,还要来个 GD 来生成二维码呢。

@jhdxr 你也别心疼 @serial 了,我们都是做 toy 的,你家 @serial 能做出来 toy 么?
aisk
2016-08-01 23:37:23 +08:00
hard2reg
2016-08-02 00:29:02 +08:00
胶水语言嘛!
cszhiyue
2016-08-02 01:22:15 +08:00
Mirage09
2016-08-02 01:28:03 +08:00
终于理解为什么会有 php 是最好的语言这个梗了..
VYSE
2016-08-02 01:28:06 +08:00
哎用了 PYPY,结果用了递归跑一段时间就 crash,只能换回,速度成大问题
SlipStupig
2016-08-02 01:42:24 +08:00
@VYSE 目前 lxml 在 Pypy 上还是跑不起来
shyling
2016-08-02 01:50:07 +08:00
脚本小子。。
mathgl
2016-08-02 02:19:11 +08:00
@SlipStupig 5.3 以上的听说可以了。原来主要是 cpyext 的问题。
mathgl
2016-08-02 02:24:25 +08:00
@jjx twisted 第一个版本应该是 02 年左右的事。比 java 稍慢些。

基于 twisted 的 txmongo 就挺好用的。我一直在用。

说真的,如果一个网站,能搞到性能瓶颈是非换 python 不可,估计也很成功了。
GeekGao
2016-08-02 02:40:25 +08:00
@serial 关于"并发 IO === 渣"的推论很有趣,立论不太对吧。
CPython 本质上是使用 C 实现的 fs 操作部分,渣,你要说渣在何处嘛。
还有你说的异步支持, IO 多路复用的部分例如 select 模块也是用 C 实现的呀,代码你可以去瞅瞅呀,凭啥说渣呢,你要这么说 Twisted 超级脚手架就不开心了,已哭晕在厕所…
我实在想不通你举几个例子就论证人家渣是啥根据。你不能看到“苹果园果树打了农药” 就到处去跟人家说 “任何树上的苹果都被喷了农药”呀,要根据情况去论证和检验下嘛。
GeekGao
2016-08-02 02:59:37 +08:00
歪了楼,极端点讲,一门基于虚拟机的语言与 C 、汇编相比能否充分压榨机器的极限,坦率的讲我个人觉得现有的编译技术够呛可以做到满分。

你再模拟,跟 C 、汇编这类贴近机器硬件的语言相比,大部分相同的功能操作也是要多出几个指令、周期的,不管跑在纯 Runtime 环境还是 JIT 编译后的,很难做到完美的优化你的机器指令!

因此,用虚拟机语言撸代码,还是别想着这些东西了,编译过程的优化你根本没法控制,个人 /团队做项目按时交付能愉快地给老板们创造价值才是王道。 不说了,睡觉明儿早起继续搬砖了。
lightening
2016-08-02 03:59:19 +08:00
@serial
“ Facebook 在他们那丑陋缓慢的 PHP 上做了 C++ 适配层(这当然花了并且还在花他们很多钱)”
可以想见如果他们一开始就花这么多时间用 C++ 的话,公司就直接死了。
lightening
2016-08-02 04:09:07 +08:00
@serial

是的, Python CPU 计算慢, IO 并发低。但它开发速度快啊!比 Bash 是肯定快的。

不过 @serial 也没说错, Python 就是用来做模型、做实验的。不过创业本来就是做原型——没人做过相同的事情,所有的东西本来都是做实验,这周做出来的东西用户反响不好,下周就拆掉重做了。你要能保证做出来东西第一个月上线就有一亿用户那我也不推荐你用 Python.
PythonAnswer
2016-08-02 05:33:58 +08:00
CPU 密集型操作,你用 c 或者 java 或者 go 重写然后 python 再调用就是了。所有动态脚本语言都慢,你换上 lua/node 一样也是觉得慢。

但是脚本就是撸的快啊。
serial
2016-08-02 08:35:22 +08:00
@aisk

先搞懂什么是 Linux ,菜鸟
serial
2016-08-02 08:41:03 +08:00
@aisk
> “我已经笑出腹肌了,“ nodejs 惯例显示在浏览器”是什么鬼?“ Linux 没有 GUI ”又是什么鬼?当然你非要扯 Linux 内核没 GUI 的话,那你这个强行装 X 我服。另外 nodejs 为何不需要图形处理库?人家 PHP 主要拿来做网站,还要来个 GD 来生成二维码呢。 ”

图形是由客户端来显示的, understand ?

至于二维码,我请问二维码在服务端是什么东西?就是二进制数据。你用什么显示? Unix terminal 。最基本的服务器、客户端常识都没有。

nodejs 是什么? fs 、 net 、 process --- Unix 系统库的 wrapper 。没事读点 Unix Linux 的常识。、

关键字 “ kernel ”、“ GNU/Linux ”、“ Glibc ”、“ distribute ”,先好好把这些基础常识搞懂了。写 python 写傻了?哥哥写 python 3 年, nodejs 5 年, C 7 年,你那点水平连入门都没有。
serial
2016-08-02 08:45:13 +08:00
@PythonAnswer

> "你用 c 或者 java 或者 go 重写然后 python 再调用就是了"

问题来了。你用 c 或者 java 或者 go 写什么系统呢?

1. 文件系统? OK ,那么 python 做的仅仅是 shell 的作用,如我所说,运维脚本而已。

2. 网络系统? OK ,很抱歉,如我 35 楼所说, python 第三方库没有非阻塞 IO 支持,因此你做不了。

3. 分布式 IO ? OK , 2 你都做不了,这一点更别提了。

4. 数据建模? OK ,正如我所说,这是科研非专业程序员的 work ,对于你一个职业程序员,这会让你没有饭吃,除非你转行做科研。

另外一提,我现在就在跟搞科研的人合作 --- 地址探测。并且他们不仅需要数据分析、建模,还需要 3D 可视化。他们不只用 python ,还用 fortran 。
serial
2016-08-02 09:09:16 +08:00
@GeekGao

这一点很有意思,你说的很对, python 2 有很多异步非阻塞 IO 框架: Twisted 、 tornado 、 gevent 。 python 3 原生提供 asyncio 支持。然而,问题也就在这:

1. python 2 、 3 版本分化, Twisted 、 tornado 、 gevent 、 asyncio 互相分化,你在一个框架、库写的东西,无法移植到另一个。

2. Twisted 、 tornado 、 gevent 、 asyncio 实现非常不优雅,我想看看他们的文档中的 example 就知道了。

3. 最为关键的,我已经提到了: pymongo ( mongodb 客户端)、 pymysql ( mysql 客户端)、 docker-py ( docker 客户端)、 paramiko ( ssh 客户端)、...,它们都是基于 httplib 。他们不支持 Twisted 、 tornado 、 gevent 、 asyncio 。好吧,也许你说猴子补丁。但是,猴子补丁的问题已经很明显了:版本更新(我想不需要我解释了)。

4. 综上所述,如果你要拿 python 做网络服务,那么只有两种选择:( 1 )自己重写所有的非阻塞 IO 驱动,比如 Openstack (关键字:人力成本、学习成本 --- 然而产生的结果,在其他语言都是现有的)( 2 )放弃并发 IO ,选用 djiango 、 flask ,开多线程,成为一个小众服务 ------ 我得说,你这种程序只能是个小群体用户,高并发根本不存在

当然,你非要说,我就是没有并发要求。那么,用 python 自然是可以的。 wordpress 、 Discuz! 二次开发都产生了那么多个人博客, python 自然没问题。但是,我得说,这就是楼上所说的: toy 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX