最近研究 python 的一个小失落

2016 年 8 月 1 日
 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

33566 次点击
所在节点    Python
268 条回复
serial
2016 年 8 月 3 日
@GeekGao

呵呵,你的智商很感人!
serial
2016 年 8 月 3 日
@dzhou121

所以说嘛,用 Python 你就写写运维脚本就行了,别扯其他的,因为你没有这些设施。
liangmishi
2016 年 8 月 3 日
@SlipStupig 当然不能。
之所以会提那个问题,是想知道当前请求的数据库查询阻塞了,是不是其他请求的查询也会跟着阻塞,进而影响请求的响应时间。如果是整个数据库挂掉引起的阻塞,那就跟他们讨论的点一点关系都没有了。。从 @GeekGao 的建议可知, kill 掉慢查询,或者使用非阻塞的库即可。具体问题具体分析吧。
serial
2016 年 8 月 3 日
@dzhou121

我现在让你写个 web servie ,进行日志分析任务。要求提供分布式存储、观看任务状态的消息队列、实时客户端回馈。你给我用 python 设计设计来。

请问,我该用哪些 python 库可以实现。我的要求高了,我这是一个认真的项目,你给我的库必须是工程级别,经过认真测试应用的,而不是某个菜鸟凭着兴趣爱好摸索的一些实验品。我要求满足:至少每秒处理五千次读请求数、每秒处理一千次写请求数。(这个要求不高吧,顶多算分布式环境入门级别)

==========================================================

看看当今流行语言的 Benchmark : https://github.com/kostya/benchmarks

Python 就是个垫底的货,写写单机的东西就行了,干干运维就行了,千万别把自己写的 python 程序当回事。
hanfeng3015
2016 年 8 月 3 日
谈语言的“速度”,其实是一句空话。语言只负责描述一个程序,而程序运行的速度,其实绝大部分不取决于语言。它主要取决于 1)算法和 2)编译器或解释器的质量。编译器和语言基本是两码事。同一个语言可以有很多不同的编译器实现,每个编译器生成的代码质量都可能不同,所以你没法说“ A 语言比 B 语言快”。你只能说“ A 语言的 X 编译器生成的代码,比 B 语言的 Y 编译器生成的代码高效”。这几乎等于什么也没说,因为 B 语言可能会有别的编译器,使得它生成更快的代码。

举个例子吧。在历史上, Lisp 语言享有“龟速”的美名。有人说“ Lisp 程序员知道每个东西的值,却不知道任何事情的代价”,讲的就是这个事情。但这已经是很久远的事情了,现代的 Lisp 系统能编译出非常高效的代码。比如商业的 Chez Scheme 编译器,能在 5 秒钟之内编译它自己,编译生成的目标代码非常高效。它可以直接把 Scheme 程序编译到多种处理器的机器指令,而不通过任何第三方软件。它内部的一些算法,其实比开源的 LLVM 之类的先进很多。
larkifly
2016 年 8 月 3 日
@serial 我很想知道用其他语言怎么实现你的这些需求!!!
m8syYID5eaas8hF7
2016 年 8 月 3 日
@serial 你说的没错。。。我并没有感觉到你在黑 Python 啊,只是说出了 Python 的劣势而已,下面很多人莫名高潮让我非常诧异。。。
serial
2016 年 8 月 3 日
@hanfeng3015

错误,听说过 Lisp 机吗? Lisp 机败给了 C 机器,原因就是速度。

我拿 JavaScript 和 C 来比较。以 64 位 CPU 和 64 位操作系统来讲,在 JavaScript 中所有整数、浮点数都是按照 64 位存储的。也就是说,你存储一个数组 [1, 2, 3],至少占用 64 * 3 位。在 C 中不是,整数有 8 位、 16 位、 32 位、 64 位,你存储一个数组 [1int8, 2int8, 3int8] 只占用 8 * 3 位,存储 [1int32, 2int32, 3int32] 只占用 32 * 3 位。

懂我的意思吗?当你计算的时候, JavaScript 需要 CPU 扫描 64 * 3 个比特,而 C 呢?

其他更多了,比如数组。 JavaScript 数组是可变长度的。什么意思? 你存储 a = [1, 2],然后 a.push(3)。发生了什么? JavaScript 的解释器先在堆上分配一块大内存(尽可能多,绝对不是 64 * 2 ),然后把 3 放进去。这块内存填满怎么办? 按照 2 的倍数分配一块新内存,把数据复制过来,把 3 放进去,然后释放旧的内存。

你做了 2 次分配, 1 次释放,而且占用内存还特别大。

C 呢?你存储 a = [1, 2], a 就不能再变了,它始终分配 32 * 2 个内存。想要堆?使用 malloc() 分配指定的单元内存,然而,它的长度是固定的!这就是效率的秘密。

性能和编写方便,是完全对立的。
serial
2016 年 8 月 3 日
@hanfeng3015

Chez Scheme 编译器,借助了 C 的中间码。但是当你做系统调用的时候,比如磁盘 IO ,特别是 seek 的时候,你就能感觉到速度的差别。
loveshouhu
2016 年 8 月 3 日
看大神们互掐,掐出了好多不会或者不熟悉甚至不知道的知识点。楼主我们一起努力学习吧。说不定有一天可以像他们一样谈笑风生。😀😀😀
dzhou121
2016 年 8 月 3 日
@serial

我从没有说 Python 性能好这也能用那也能用,你这个场景让我用 Python 实现的意义是什么?

Python 的性能是很差,所以需要性能的地方我当然不会用 Python ,但是所有系统的最重要的需求是性能吗?不见得吧。就拿 Openstack 来说, Nova 不需要特别强的性能呀,因为就是提供管理 VM 的 API 。但是 Ceilometer 就不行,需要很强的性能, Python 其实不合适的。

>>Python 就是个垫底的货,写写单机的东西就行了,干干运维就行了,千万别把自己写的 python 程序当回事
不是说一个程序一定要 scale 到成千上万的机器才是有意义的,程序本身没有意义,程序能解决的问题本身才有意义
yszx
2016 年 8 月 3 日
语言大战么····
那我说一个没多少人知道的····python 的循环-sleep 有 bug ,有一定几率 sleep 了之后就再也起不来了。曾经困扰过我们很久
R4rvZ6agNVWr56V0
2016 年 8 月 3 日
就 @serial

关于数据处理,这眼界也真是 [狭窄] 得令人无语,你做不到不代表别人做不到啊,
国外就不说了,公开资料来看国内的豆瓣就用 Python 重写 Spark 处理数据啊
https://www.douban.com/subject/10774736/


你自己慢慢看吧。如果非要抬性能的杠也没啥意思,你用啥觉得性能好就用啥呗,俗话说 u can u up 嘛。
在 Sun 没有收购 HotSpot 技术前, Java 性能也被人诟病,又如何,即便现在 C/C++程序员可能还对 Java 有偏见,
但并不影响开源社区用它去做分布式和大数据应用!

还有,代码写不好不要怪语言和编译器,多反思自己用的技术是不是很契合自己的应用场景,换句话说你用 C 撸了一堆所谓 [高效] 的代码,速度在优于 Python ,实现的玩意不值钱,有个逑用。
R4rvZ6agNVWr56V0
2016 年 8 月 3 日
@dzhou121 我觉得也没必要讲那么多了,有的人可能就是一根筋,要么是真的傻,要么就是故意吐槽来的。浪费时间讲太多没用的。
crossmaya
2016 年 8 月 3 日
肿莫了。
xi2008wang
2016 年 8 月 3 日
大家可以看看这个链接: python 解释器实现 https://www.zhihu.com/question/25307289
我最近也看了点 python 源代码,一句话就是: python 好用、灵活 但是实现复杂 结果就慢了
所以要高效就用 C 、 python 混合编程


serial 同学说的确实没说错,只不要推广你的 Nim 语言这软广那是比较明显 😄
DoctorCat
2016 年 8 月 4 日
“ IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧 ”
这话没错啊,如果操作系统不对 IO 异步做支持,也没办法啊,我想你是没经历过 PC-DOS 、小霸王学习机的年代吧,还有啊倘若我照着《 30 天自制操作系统》些个 OS 雏形,也可以不支持线程和 fork 额,这样你什么样子的编程语言也都无可奈何了吧
pyufftj
2016 年 8 月 4 日
从来没有对 python 进行过优化,因为现在计算机的 cpu 不是瓶颈,数据库读写和网络传输才是瓶颈。
serial
2016 年 8 月 4 日
@GeekGao

真是逗比,你知道 python 在 spark 是什么角色吗?

等一下,你知道 spark 怎么架设么? 别拿你不懂的东西瞎 bb
xiaohuangya
2016 年 8 月 4 日
初学 python 。看到各位大牛在斗嘴。我习惯性的留个名字。(ง •̀_•́)ง

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

https://study.congcong.us/t/296233

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

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

© 2021 V2EX