最近研究 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

30860 次点击
所在节点    Python
268 条回复
Felldeadbird
2016-08-01 10:39:13 +08:00
要性能还是要优雅的 py ,看你怎样看了。
SlipStupig
2016-08-01 10:44:50 +08:00
@Felldeadbird 最近在看 JIT ,大致就是将 Bytecode 转成 LLVM IR 然后转成汇编,现在像 pyston 和 numba 都是这么做的,速度提升还不错,更好的是 PyPy 但是对一些扩展库兼容的不好,总的来说性能和优雅是可以兼顾的,但是需要一定代价!
GeekGao
2016-08-01 10:45:47 +08:00
直接操作寄存器、 x86 指令码快更 native ,你们倒是 coding 去啊,呵呵呵。
GeekGao
2016-08-01 10:49:57 +08:00
@serial 照你这么说 Youtbue 、 Quora 、 Dropbox 、 NASA … 哭晕在厕所了。 OpenStack 应该用 C 重撸了……
ainimuyan
2016-08-01 10:55:23 +08:00
serial 说的是事实,很多公司是都在用 python ,但是应用场景不同, python 也确实构建了很多大型项目,但是侧重点不同,别为了喷而喷
GeekGao
2016-08-01 10:57:48 +08:00
“ python 都能做,做的都很垃圾 --- CPU 计算慢, IO 并发低,特别是标准库写的特别差” 请问这是啥事实,有论证么?
某些同志凭感官就抛出 [事实] 二字也真是醉了。
clino
2016-08-01 10:57:57 +08:00
你如果很在乎性能就不应该用纯 python,至少要用 python 配合其他语言来做
python 比较强的还是自带电池多,开发效率高
像想榨干硬件性能,或者大的系统之类的场合,都用 python 肯定不合适
GeekGao
2016-08-01 11:00:01 +08:00
@clino 同意这位同志的语录:你如果很在乎性能就不应该用纯 python,至少要用 python 配合其他语言来做
justou
2016-08-01 11:13:24 +08:00
除了掌握一些 pythonic 的编程技巧提升程序的效率外, 大幅提升 python 执行效率的办法多的是啊,
感觉比较灵活的还是在 cython 中 C/C++, python 混编, 灵活跟效率自己平衡
luluuulu4848
2016-08-01 11:25:27 +08:00
解释性的语言 性能都没有编译性语言快啊。。。不知道你们在争什么,解释性语言就是开发的快成本低,有不是所有应用都需要很快,专业软件用 C++去重写去 肯定快
zmj1316
2016-08-01 11:28:00 +08:00
python 属于写的爽运行起来痛苦的那种,需要性能要不上 pypy 这种 JIT ,要不就用 C/C++呗
@serial 说的没什么错,被喷表示心疼
a412739861
2016-08-01 11:38:17 +08:00
@zmj1316 写起来爽,运行起来痛苦+1 …………
wuxqing
2016-08-01 11:52:13 +08:00
所有,我现在都是 c 封装成函数, python 调用
jjx
2016-08-01 15:55:29 +08:00
@zmj1316

什么叫没有错,科学计算/数据分析的底层库如 numpy/pandas 等都是高度优化的,大部分都直接用 cython 写,正是因为有了这些高度优化的底层库,才能让业务人员解脱出来, 喷的完全不在点上
serial
2016-08-01 21:03:58 +08:00
@wizardforcel @kingmo888

Of cause. Python 甚至在某些方面取代了 R 语言。然而, matlab 和 R 是用来建模的,不是做应用的 (它们甚至连完整的编程语言特征都不具备)。

什么样的人在使用 matlab 和 R ? 科学研究领域。他们 80% 的知识是懂电路、生物、化学、..., 20% 的知识是懂 Python 、 matlab 、 R 。他们的任务就是用这些语言重现、测试自己的实验。

那么,问题是,你是打算成为这样的科研者,还是一个专职程序员?如果你,一个 80% 的知识是懂 Python 、 matlab 、 R , 20% 的知识是懂电路、生物、化学、...,那么毫无价值。

@mengzhuo “两个游戏逻辑服务的表示, Python 的理念是,不够就堆机器”

1. 你的“游戏逻辑服务”,多少用户?
2. 每秒并发请求能到多少?
3. 做过 benchmark 、压力测试吗?
4. 数据量能多少?玩过 TB 级别的数据存储吗?
5. 什么是阻塞 IO ?什么是非阻塞 IO ?用了哪一种?

@WhiteT

你可以举个 “那么多新兴互联网公司要选择 Python ” 的例子。 Twitter 把他们的业务从 ruby 切换到了 Scala ; Facebook 在他们那丑陋缓慢的 PHP 上做了 C++ 适配层(这当然花了并且还在花他们很多钱); Dropbox 正在把自己的分布式文件系统从 GO 切换到 Rust 。

---------------------------------------------------

如果你要做 Web service ,那么 3.5 asyncio 是个不错的选择,非阻塞 IO 的 wrapper 。然而,一个问题就是 Python 2/3 没有非阻塞 IO 的第三方库支持。 pymongo ( mongodb 客户端)、 pymysql ( mysql 客户端)、 docker-py ( docker 客户端)、 paramiko ( ssh 客户端)、...,它们都是基于 httplib ,没错,它们都是同步的!!!

这就表示,它们的并发 IO === 渣。

如果你想做非阻塞应用,为了高并发,你必须用 asyncio 或者其他非阻塞 IO 库,重写这些库。最典型的例子 --- Openstack 。

就我所知,非阻塞 IO 的流行语言和库:

* C --- libev libevent --- 代表作 Nginx
* Nim --- asyncdispatch --- 代表作
* Erlang --- stdlib --- 代表作 Whatsapp
* Java --- nio netty --- 代表作 Hadoop
* Golang --- stdlib --- 代表作 Docker
* JavaScript --- node.js --- 代表作 Joyent 云服务

至于文件系统,动态语言无法胜任, Java 也无法胜任,这是 C 、 C++、 D 、 Nim 、 Rust 这些系统语言的战场。
jjx
2016-08-01 21:32:07 +08:00
gevent 惨被无视, 年龄堪比 java 的 twisted , 可以说时 asyncio 的原型也惨被无视
tairan2006
2016-08-01 21:37:55 +08:00
@serial 有点纸上谈兵了吧。当年腾讯买断偷菜版权,每个月收入数千万,同时在线数亿人,不就是靠着服务器(好像还是 windows 服务器)堆起来的么…时间根本来不及搞什么优化,不照样挺过来了。

就像微信的打飞机这种现象级游戏,不过是昙花一现,赚到钱就好了,写的时候就求一个快,还从底层慢慢搞?我用 C++写 3 个月写个偷菜, Python 一个月,那就至少损失了一个亿。你说你是要少几台服务器,还是要一个亿?每种语言都有自己的价值,一味在意性能未免过于匠气。
cszhiyue
2016-08-01 21:44:14 +08:00
@zmj1316 它的观点还停留于 python 只适合自动化脚本
ProfFan
2016-08-01 22:30:08 +08:00
@jjx 强行黑太多。用了这么多年 Python 了,要性能就 numpy 、 Cython ,实在不行还可以对接 C++模块。实时有 zmq 、 gevent 。不知道上面这些黑点从哪来。。。
jhdxr
2016-08-01 23:04:52 +08:00
心疼 @serial 被一堆做 toy 的喷成这样子。。。

至于说堆机器的。。。一方面你考虑过你应用的本身最多能堆多少台机器么?(说没有上限的可以闭嘴了,我不信你的每台机器可以独立完成所有业务);另外一方面,没种语言都有自己的适应场景,用 A 语言堆 100 台机器才能完成的,换 B 语言很有可能 10 台就搞定了

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

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

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

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

© 2021 V2EX