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();
1
wangxn 2016-08-01 08:43:54 +08:00 via Android
你理解错了…… slightly 是副词,意为这个选项可以轻微优化生成的字节码。
|
2
wangxn 2016-08-01 08:48:54 +08:00 via Android 1
以 CPython 的运行速度,做优化几乎是没什么作用的。瓶颈这么多,随便一个都拖后腿了。例如基于栈的字节码,简陋的 mark-sweep GC , GIL ,太多了。
|
3
RqPS6rhmP3Nyn3Tm 2016-08-01 08:55:48 +08:00 via Android
想快还得 JIT 啊,默认解释器就是慢没办法
|
4
serial 2016-08-01 09:00:02 +08:00 2
python 就不要求速度了,如果你不会 Shell ,可以拿 python 做自动化脚本 --- 特别是处理正则表达式。其他方面, python 都能做,做的都很垃圾 --- CPU 计算慢, IO 并发低,特别是标准库写的特别差。
|
6
serial 2016-08-01 09:07:49 +08:00 1
@kideny
这不是喷,这叫事实。每个语言都有其位置和商业模式。 python 的位置和商业模式就是: perl shell 替代品的运维脚本、非专业程序员的数据师的建模脚本。其他, python 只是重在参与。 |
7
SlipStupig OP |
8
serial 2016-08-01 09:10:14 +08:00 3
@kideny
我就拿图像识别来说吧, python 的库非常多,(甚至神经网络的库都一大堆)。其中很多都是某些科学领域,但是非专业程序员写的,因为 python 对编程的要求门槛低。 但是当要把这些图像识别之类的程序拿来做服务,商用的时候,都会转用 C/C++ 来重写。 python 只是数学家提供的一个算法描述,它的速度不适合应用。 |
9
wander2008 2016-08-01 09:12:41 +08:00 via iPhone
@serial 老到之人。
|
10
wizardforcel 2016-08-01 09:14:38 +08:00
@serial 不就是速度慢嘛?? matlab 和 r 速度更慢,不照样有搞数据的人在用??
|
11
kingmo888 2016-08-01 09:22:04 +08:00
喷 python 就喷吧。
python 的定位能与 R 等同,高于 matlab 。 |
12
strwei 2016-08-01 09:38:43 +08:00 via iPhone
php 是全世界。。。。。(逃
|
13
xueqt 2016-08-01 09:44:10 +08:00
喷子到处都有,无视就好
|
14
ihciah 2016-08-01 09:45:45 +08:00 via iPhone
喷语言没有任何意义
|
15
mengzhuo 2016-08-01 09:51:33 +08:00 1
|
16
yangtukun1412 2016-08-01 10:01:13 +08:00 8
"There are only two kinds of languages: the ones people complain about and the ones nobody uses."
|
17
WangYanjie 2016-08-01 10:20:23 +08:00
哪里告诉你可以提高性能了, help
|
18
est 2016-08-01 10:21:02 +08:00 4
当年大家也觉得 C 语言是做模型的,真正要“工业级”效率还是汇编。呵呵。
|
19
Ahri 2016-08-01 10:28:14 +08:00
Python 是有点慢, R 和 MATLAB 是真慢。
|
20
WhiteT 2016-08-01 10:35:33 +08:00
@serial Python 性能确实不如 C/C++ ,但现在的总体趋势难道不是提高机器硬件的水平以节约程序员的时间么?特别是处于业务扩张型的公司。不然为何如今那么多新兴互联网公司要选择 Python ?还是你觉得与其节约你的时间,还是节约机器开销更划算?当然我也同意随着用户量的提升,业务的稳定,转底层语言优化性能是个正确的选择,但这也需要平衡一下使用底层语言开发的成本和买机器的成本那个更低。而且私以为用户量到了因语言导致的性能瓶颈的公司并没有多少。
|
21
Felldeadbird 2016-08-01 10:39:13 +08:00
要性能还是要优雅的 py ,看你怎样看了。
|
22
SlipStupig OP @Felldeadbird 最近在看 JIT ,大致就是将 Bytecode 转成 LLVM IR 然后转成汇编,现在像 pyston 和 numba 都是这么做的,速度提升还不错,更好的是 PyPy 但是对一些扩展库兼容的不好,总的来说性能和优雅是可以兼顾的,但是需要一定代价!
|
23
GeekGao 2016-08-01 10:45:47 +08:00
直接操作寄存器、 x86 指令码快更 native ,你们倒是 coding 去啊,呵呵呵。
|
24
GeekGao 2016-08-01 10:49:57 +08:00
@serial 照你这么说 Youtbue 、 Quora 、 Dropbox 、 NASA … 哭晕在厕所了。 OpenStack 应该用 C 重撸了……
|
25
ainimuyan 2016-08-01 10:55:23 +08:00 1
serial 说的是事实,很多公司是都在用 python ,但是应用场景不同, python 也确实构建了很多大型项目,但是侧重点不同,别为了喷而喷
|
26
GeekGao 2016-08-01 10:57:48 +08:00
“ python 都能做,做的都很垃圾 --- CPU 计算慢, IO 并发低,特别是标准库写的特别差” 请问这是啥事实,有论证么?
某些同志凭感官就抛出 [事实] 二字也真是醉了。 |
27
clino 2016-08-01 10:57:57 +08:00
你如果很在乎性能就不应该用纯 python,至少要用 python 配合其他语言来做
python 比较强的还是自带电池多,开发效率高 像想榨干硬件性能,或者大的系统之类的场合,都用 python 肯定不合适 |
29
justou 2016-08-01 11:13:24 +08:00
除了掌握一些 pythonic 的编程技巧提升程序的效率外, 大幅提升 python 执行效率的办法多的是啊,
感觉比较灵活的还是在 cython 中 C/C++, python 混编, 灵活跟效率自己平衡 |
30
luluuulu4848 2016-08-01 11:25:27 +08:00
解释性的语言 性能都没有编译性语言快啊。。。不知道你们在争什么,解释性语言就是开发的快成本低,有不是所有应用都需要很快,专业软件用 C++去重写去 肯定快
|
31
zmj1316 2016-08-01 11:28:00 +08:00
python 属于写的爽运行起来痛苦的那种,需要性能要不上 pypy 这种 JIT ,要不就用 C/C++呗
@serial 说的没什么错,被喷表示心疼 |
32
a412739861 2016-08-01 11:38:17 +08:00
@zmj1316 写起来爽,运行起来痛苦+1 …………
|
33
wuxqing 2016-08-01 11:52:13 +08:00
所有,我现在都是 c 封装成函数, python 调用
|
34
jjx 2016-08-01 15:55:29 +08:00
@zmj1316
什么叫没有错,科学计算/数据分析的底层库如 numpy/pandas 等都是高度优化的,大部分都直接用 cython 写,正是因为有了这些高度优化的底层库,才能让业务人员解脱出来, 喷的完全不在点上 |
35
serial 2016-08-01 21:03:58 +08:00 3
@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 这些系统语言的战场。 |
36
jjx 2016-08-01 21:32:07 +08:00 1
gevent 惨被无视, 年龄堪比 java 的 twisted , 可以说时 asyncio 的原型也惨被无视
|
37
tairan2006 2016-08-01 21:37:55 +08:00 2
@serial 有点纸上谈兵了吧。当年腾讯买断偷菜版权,每个月收入数千万,同时在线数亿人,不就是靠着服务器(好像还是 windows 服务器)堆起来的么…时间根本来不及搞什么优化,不照样挺过来了。
就像微信的打飞机这种现象级游戏,不过是昙花一现,赚到钱就好了,写的时候就求一个快,还从底层慢慢搞?我用 C++写 3 个月写个偷菜, Python 一个月,那就至少损失了一个亿。你说你是要少几台服务器,还是要一个亿?每种语言都有自己的价值,一味在意性能未免过于匠气。 |
39
ProfFan 2016-08-01 22:30:08 +08:00
@jjx 强行黑太多。用了这么多年 Python 了,要性能就 numpy 、 Cython ,实在不行还可以对接 C++模块。实时有 zmq 、 gevent 。不知道上面这些黑点从哪来。。。
|
40
jhdxr 2016-08-01 23:04:52 +08:00 2
心疼 @serial 被一堆做 toy 的喷成这样子。。。
至于说堆机器的。。。一方面你考虑过你应用的本身最多能堆多少台机器么?(说没有上限的可以闭嘴了,我不信你的每台机器可以独立完成所有业务);另外一方面,没种语言都有自己的适应场景,用 A 语言堆 100 台机器才能完成的,换 B 语言很有可能 10 台就搞定了 |
41
aisk 2016-08-01 23:30:15 +08:00 1
@serial 看到脚本喷性能,看到性能快的喷开发效率,反正怎么也不和心意。那好吧,给你个动态语言的高性能实现, v8 / node 咋样?你又喷人家回调代码可读性差。那好,给你最新的 es ,有 async / await ,解决回调嵌套的问题,你又喷增加理解难度, class 关键字破坏原型链继承的纯洁性。那来个 google 的 go 语言如何,性能也不错,抽象程度也比较高,还全程异步 IO 效率高。结果呢,你又嫌人家没泛型,异常处理又啰嗦。那来个随大流的 Java 如何,全球很多大公司都在用,这回不会错了吧,但我知道你一定嫌弃 Java 语法太啰嗦不容易玩出花儿来,还是 oracle 家的产品,吃枣药丸。那给你世界上最好的语言 PHP 如何,我猜您一定会说,切,连操作系统都不能写,好意思说自己是编程语言么?
|
42
aisk 2016-08-01 23:36:55 +08:00 1
再分享一个 @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 么? |
43
aisk 2016-08-01 23:37:23 +08:00
@serial 高论传送们: http://v2ex.com/t/294226#;
|
44
hard2reg 2016-08-02 00:29:02 +08:00
胶水语言嘛!
|
45
cszhiyue 2016-08-02 01:22:15 +08:00
|
46
Mirage09 2016-08-02 01:28:03 +08:00 via iPhone
终于理解为什么会有 php 是最好的语言这个梗了..
|
47
VYSE 2016-08-02 01:28:06 +08:00
哎用了 PYPY,结果用了递归跑一段时间就 crash,只能换回,速度成大问题
|
48
SlipStupig OP @VYSE 目前 lxml 在 Pypy 上还是跑不起来
|
49
shyling 2016-08-02 01:50:07 +08:00 via iPad
脚本小子。。
|
50
mathgl 2016-08-02 02:19:11 +08:00
@SlipStupig 5.3 以上的听说可以了。原来主要是 cpyext 的问题。
|
51
mathgl 2016-08-02 02:24:25 +08:00
@jjx twisted 第一个版本应该是 02 年左右的事。比 java 稍慢些。
基于 twisted 的 txmongo 就挺好用的。我一直在用。 说真的,如果一个网站,能搞到性能瓶颈是非换 python 不可,估计也很成功了。 |
52
GeekGao 2016-08-02 02:40:25 +08:00
@serial 关于"并发 IO === 渣"的推论很有趣,立论不太对吧。
CPython 本质上是使用 C 实现的 fs 操作部分,渣,你要说渣在何处嘛。 还有你说的异步支持, IO 多路复用的部分例如 select 模块也是用 C 实现的呀,代码你可以去瞅瞅呀,凭啥说渣呢,你要这么说 Twisted 超级脚手架就不开心了,已哭晕在厕所… 我实在想不通你举几个例子就论证人家渣是啥根据。你不能看到“苹果园果树打了农药” 就到处去跟人家说 “任何树上的苹果都被喷了农药”呀,要根据情况去论证和检验下嘛。 |
53
GeekGao 2016-08-02 02:59:37 +08:00
歪了楼,极端点讲,一门基于虚拟机的语言与 C 、汇编相比能否充分压榨机器的极限,坦率的讲我个人觉得现有的编译技术够呛可以做到满分。
你再模拟,跟 C 、汇编这类贴近机器硬件的语言相比,大部分相同的功能操作也是要多出几个指令、周期的,不管跑在纯 Runtime 环境还是 JIT 编译后的,很难做到完美的优化你的机器指令! 因此,用虚拟机语言撸代码,还是别想着这些东西了,编译过程的优化你根本没法控制,个人 /团队做项目按时交付能愉快地给老板们创造价值才是王道。 不说了,睡觉明儿早起继续搬砖了。 |
54
lightening 2016-08-02 03:59:19 +08:00 2
|
55
lightening 2016-08-02 04:09:07 +08:00
|
56
PythonAnswer 2016-08-02 05:33:58 +08:00
CPU 密集型操作,你用 c 或者 java 或者 go 重写然后 python 再调用就是了。所有动态脚本语言都慢,你换上 lua/node 一样也是觉得慢。
但是脚本就是撸的快啊。 |
58
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 年,你那点水平连入门都没有。 |
59
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 。 |
60
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 。 |
61
FrankHB 2016-08-02 09:33:49 +08:00 3
哪里战了,不就是科普一些废话浪费口水罢了。倒是照例钓出个别对语言实现常识少根筋的的。(以下无涉勿对号入座。)
@kingmo888 但是人家 R 和 Matlab 可是老老实实当 DSL ,没像 py 几乎啥玩意儿都想掺一脚交易一下…… @est 毕竟当年的汇编也比较图样嘛……对硬布线的实现有些迷信也是容易理解的。不过现在呢? @GeekGao 为什么和 native 有关系?是说 native 就有性能优势么。然而你所谓的 x86 ,钦定的 native operating mode 可是不鸟 x64 来着,一坨 SIMD 就这样废了…… 而且说到底这种程度的 native 还不是要被 decoder 艹一遍嘛。敢直接操作没 renaming 过的 register file 么? 最后,你最好别对硬件实现的节操有多少幻想。(虽然昨天我这还是决定 RCP/RSQRT(PD/PS/SD/SS)还是 EU 支持算了……拆二十几条 uop 性能上太蠢,简直是找卡马克打嘛……) @luluuulu4848 哪个语言钦定解释哪个语言钦定编译,编译的目标是什么,能看清楚再扯蛋么。 (不是我黑……其实即便是 CPython 这样的软蛋,吊打 cint 这样的“ C/C++”实现,还是绰绰有余的……) @aisk Linux 发行版和 Linux 当然不是一回事。 Linux 项目哪里维护 GUI 了?也不都需要装 X 嘛, Wayland 不知是不是够用了…… 顺便多数语言就是没法做一般意义的操作系统,除非修改语言本身(不止是语言的实现)。 ISO C 和 ISO C++说清楚了 freestanding environment ,所以实现可以直接往上糊。 Java 和 C#之类就得借助外部的 spec 。多数其它语言根本就没能耐管这个。 |
65
serial 2016-08-02 10:16:06 +08:00
@likuku
你要分清服务器和客户端的区别。一个关键字:“协议”。 现在最简单通用的可以说是“ JSON ”,我们可以拿这个举例。服务器产生`{"x": 1, "y": 1, "z": 1, "w": 10, "h": 10, "l": 10}`,这就是服务器产生的数据,再加上协议头,由客户端及其 UI 库负责显示任务。 客户端可以用 table 显示这个数据: x y z w h l 1 1 1 10 10 10 也可以用 3D 立方体显示这个数据 ---- / / | ---/ 到底怎么显示,完全取决于客户端的 UI 库和算法程序。 |
66
FrankHB 2016-08-02 10:30:17 +08:00
@serial X 窗口系统所谓的 C/S 架构,其中的 server 指的是提供某些设备抽象在内的基础环境服务的实现;而 client 是这些服务的用户,也就是普通的 app 。 X client 一般利用 xlib 和 xcb 这样的 client API 来和 X server 通信。最终显示到设备这个过程,是 X server 内部实现保证的,普通的 X client 是不会直接插手的。这里的协议包括一个系列。
至于你说的“怎么显示”,实际上是指 client 决定要显示的具体内容,这点窗口系统管不着。对协议来讲,这算是透明的负载。在有底层窗口系统支持的情况下,普通 app 用的 UI 库也只能管到这(至少倒腾图形驱动不算是传统 UI 库的分内事)。 另一个类似的例子是普通 Win32 app 也不会插手 csrss 怎么和 NT executive 交互。没有公开协议。 |
67
GeekGao 2016-08-02 10:32:37 +08:00
|
68
flyingghost 2016-08-02 10:33:38 +08:00
python 烂,用过的都知道。
但其实还有一种比 python 更烂的语言。烂到什么境界?所有的程序员基本对它都持鄙夷、吐槽、咒骂的态度。 语言执行效率那叫一个低,人家语言都在毫秒级拼个你死我活,它一般一个任务执行时间都以小时来计,大厂和国企搞不好是以天来做单位。 但胜在开发效率高。高,真心高。任何事,不超过三句话。 每天剩下的时间,就可以用来看新闻、打游戏、逛 1024 。 这门语言叫做:老板语言、 leader 语言、项目经理语言。 作为一枚程序员,你有木有一边诅咒一边向往啊? /手动匿名 |
69
FrankHB 2016-08-02 10:49:09 +08:00
@GeekGao 这里的出发点有两点:首先, native 这件事和性能本质上毫无关系;其次, native 也是相对而言的。是不是能更快,取决于实现的机制,而不是接口所在的具体层次。使用相对不 native 的接口的确可以给人造成慢的刻板印象,但现实中这主要错误的选型以及上层封装得太渣的锅。
x86 汇编背后的 ISA 一般计算机系统中的开发中不需要修改硬件实现的下界。这种层次的 native 仍然没有多少特殊性;像我所在的(硬件)项目就涉及实现 ISA ,于是 ISA 自然就不够 native 了。而对绝大多数软件项目来讲这个层次又太低了,实际根本不需要也不适合考虑这层东西。加上就像我所说的真没有性能更好的保证,所以这些东西和这个主题关心的东西无关。 |
70
besto 2016-08-02 10:51:25 +08:00
Python 效率不是问题,而是大项目很容易出意想不到的坑。
自己写写随意。 |
71
shliujing 2016-08-02 11:33:59 +08:00
我是来看评论的 0 0
|
72
serial 2016-08-02 11:46:53 +08:00 2
@GeekGao
Of cause. 异步仅仅是个编程范式。我所说的当然是非阻塞 IO ,重点是: “ pymongo ( mongodb 客户端)、 pymysql ( mysql 客户端)、 docker-py ( docker 客户端)、 paramiko ( ssh 客户端)、...,它们都是基于 httplib 。他们不支持 Twisted 、 tornado 、 gevent 、 asyncio 。” 当你编写网络服务时,你访问数据库 mysql 、 mongodb 、 redis 、... 访问 docker 、访问 ssh 服务、... 你不得不停下进程,等待远程服务器的返回。因为 python 现有的这些客户端库不支持非阻塞 IO ,还包括 djiango 、 flask 、 requests 。 client ---> python server ---> mysql client ---> 当多个客户端请求进来时,你的 python 服务器去访问 mysql ,就立刻变成一个阻塞访问,排队问题立马显现。 |
73
calease 2016-08-02 11:50:38 +08:00 1
根本没必要战吧,这楼里某人一看就没深入了解过 python ,连 tornado 兼容其他 async ioloop 和 motor 都不知道。三年 python 大概只是写爬虫之类的娱乐而已。
python 写服务非常有优势,现在 microservice 当道用 python 的真是多。不要总是傻乎乎的以国内的眼光看世界。有兴趣的可以去了解一下 uber 或者 pinterest 的 stack 。还动不动就大型系统,整个 v 站里估计数不出 3 个在大公司真正提出并领导搭建架构的。 |
74
GeekGao 2016-08-02 14:43:58 +08:00
@serial 建议你好好去阅读这些 driver 的源码(因为你总是说他们基于 httplib ,你呼它出来谈谈,问问它在这些 driver 实现里干啥呢),还有 IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧。
Python 如果会讲话肯定会吐槽:“ C/C++原生撸 driver 本来就特么没有给俺做 none blocking 实现,怪我咯?” 建议你好好读一读 CSAPP 看看到底啥是 IO 多路复用,不理解再辩。 |
75
ragnaroks 2016-08-02 14:52:37 +08:00
评论语言好坏却不说应用场景,那基本可以认为此人没有从事过实际开发.
|
76
HappyTrail 2016-08-02 14:55:27 +08:00
of cause 是什么 (
|
77
serial 2016-08-02 17:53:32 +08:00
@GeekGao
源代码? 真好笑,我恰恰读过很多次。我想问一下,你用过这些库吗??? 这些库的 Github 源代码地址(自己睁大眼睛好好看看): ============================== 一、 pymongo: https://github.com/mongodb/mongo-python-driver mongodb 官方驱动!!! pymongo 的同步阻塞源码: https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/pool.py 使用了 Python 标准库的 socket 模块进行 TCP 通信。自己睁大眼睛好好看看官方 socket 的解释: python 官方文档: https://docs.python.org/3/library/socket.html 二、 pymysql: https://github.com/PyMySQL/PyMySQL pymongo 的同步阻塞源码: https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/_socketio.py 使用了 Python 标准库的 socket 模块进行 TCP 通信。自己睁大眼睛好好看看官方 socket 的解释: python 官方文档: https://docs.python.org/3/library/socket.html 三、 docker-py: https://github.com/docker/docker-py docker 官方驱动!!! docker-py 的同步阻塞源码: https://github.com/docker/docker-py/blob/master/docker/utils/socket.py 使用了 Python 标准库的 select 模块进行 TCP 通信。自己睁大眼睛好好看看官方 select 的解释: python 官方文档: https://docs.python.org/3/library/select.html 你以为 docker-py 做了 Unix C select 非阻塞处理? 做梦! 看看源代码: ```py # wait for data to become available select.select([socket], [], []) try: ..if hasattr(socket, 'recv'): ....return socket.recv(n) ..return os.read(socket.fileno(), n) ``` 四、 paramiko: https://github.com/paramiko/paramiko docker-py 的同步阻塞源码: https://github.com/paramiko/paramiko/blob/master/paramiko/client.py 使用了 Python 标准库的 socket 模块进行 TCP 通信。自己睁大眼睛好好看看官方 socket 的解释: python 官方文档: https://docs.python.org/3/library/socket.html ============================================================== 你想反驳 “ Python 不支持 mongo 、 mysql 、 redis 、 docker 、 ssh 、 webhdfs 、... 非阻塞 IO ”,就拿出支持的代码!!! OK? Talk is cheap, show me the code! |
78
serial 2016-08-02 18:03:29 +08:00
@GeekGao
还 IO 多路复用,你知道什么是 IO 多路复用。好好把基础了解再喷: Unix/Linux select IO: http://123.57.217.180:5555/docs/GNU%20C%20Library/IO%20LL%20Waiting%20for%20Input%20or%20Output.md Unix/Linux epoll IO: http://123.57.217.180:5555/docs/Posix%20Library/advance%20io.md |
80
Ge4Los 2016-08-02 20:39:47 +08:00
@serial 这段对 Python 异步的解释,我是赞同的。通常异步 IO 库,对网络层的转调是异步。可后端如果挂了同步的 mysql 这类资源,就活脱脱的变成阻塞了。
你们的争论点好奇怪,名字都没对上号嘛。 |
81
xiahei 2016-08-02 21:36:21 +08:00
实力上演舌战群儒。年度精彩大戏。
|
82
jjx 2016-08-02 21:46:48 +08:00
@Ge4Los
对什么呀, 根本不在点上, 真正做事的 worker 都是阻塞的, 异步协程的作用主要在接入层面,接入更多的请求, 完成依赖于实际做事的 worker, 接入的多, 相应的就部署更多 worker 这帖子完全没有讨论的必要了 |
84
Ge4Los 2016-08-02 22:04:25 +08:00
|
85
sammiriam 2016-08-02 22:05:22 +08:00 via Android 1
楼主一不小心搞了个大新,哦不,是大热帖
|
86
GeekGao 2016-08-02 22:06:40 +08:00 1
|
88
GeekGao 2016-08-02 22:37:19 +08:00
不管你说啥,俺就一个观点: [ IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧]
没必要把一些库搬出来证明啥,其实啥也证明不了。也麻烦你仔细看俺跟你辩的到底是啥嘛。 ps:在网络上话多措辞强硬有得罪请见谅。希望接下来的辩论,不会让 v2 风气变得太差。 窃以为这种问题帖要学术些、实证些而非诡辩、争吵。伤人不太了。 |
90
liangmishi 2016-08-02 23:48:31 +08:00 via Android
@GeekGao python web 的初学者从头看到尾最后还是没明白,一直在刷新看看有没有新的回复。请教一下,如果当前请求的数据库查询阻塞了,那是不是其他请求就没办法做查询了?
谢谢 |
91
martinsu 2016-08-03 02:14:33 +08:00
专业程序员 = 专业技工 ?
非专业程序员 = 科学家 ? |
92
serial 2016-08-03 09:14:29 +08:00
@GeekGao
源代码就在 Github ,自己好好看明白了。 > IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧 这句话暴露了你有多无知。对于你这么无知,我现在给你普及一下,好好学着点,就你这水平,也有脸装: 1. 早期服务器市场,只有多进程 fork exec 。 2. 随着 CPU 技术发展,多线程的许多弊端被解决。多进程 fork 在 Linux 上开销很少,但是对于服务器,多线程开销仍然具备更大优势。 so ,多线程服务器出现,典型代表 Apache tomcat 。 3. Unix 系统开发者提出了 NON_BLOCKING 和循环检测技术,开启非阻塞 IO 技术。但是循环检测是非常低效的,需要每隔一段时间就要占用 CPU 进行检查,哪怕这次什么 IO 都没有。 4. Unix 提出 select 内核检查技术,这是替代 3 的过滤检查技术。 select 首先存储所有需要检查的文件描述符,然后提供一个睡眠,把 CPU 资源返还内核。当有多个 IO 时,内核记录各文件描述符,修改 select 存储的文件描述符, 然后唤醒 select 进程,由进程继续处理。然而, select 仍然存在一个严重问题:唤醒后, select 必须按个检查所有存储的文件描述符,有的可能根本没有 IO ,但是也会进行检查,这就造成 CPU 浪费。两个字:低效。 5. Linux 2.4.3 提出 epoll 内核事件通知技术,这是与 select 完全不一样的轮训技术(之间还出现过 poll 技术)。 epoll 分为边缘通知和水平通知(术语自己查)。首先,与 select 一样,存储所有需要检查的文件描述符,然后提供一个睡眠,把 CPU 资源返还内核。当有 IO 时,内核记录所有有 IO 的文件描述符,并且作为一个返回值返回给 epoll 进程,唤醒 epoll 进程。然后,进程挨个处理所有返回的 IO 文件描述符。差别就在这里: select 检查所有存储的文件描述符,其中有的根本没有 IO ;但是 epoll 不是, epoll 是内核返回所有有 IO 存储过的文件描述符,它们都是有 IO 要求,不存在 CPU 浪费。两个字:高效。 6. FreeBSD 随后跟进,引入了 kqueue 技术,其原理同 epoll 有相似之处。 总结: 当前服务器市场,以 epoll 、 kqueue 为主流,性能最好,并发、吞吐量最高。 服务器主要以单进程 epoll/kqueue (比如 redis )、多进程 epoll/kqueue (比如 nginx )、多线程 epoll/kqueue (比如 netty 库) 为主。对于分布式服务器,如果你不用 epoll/kqueue ,就直接关门倒闭吧。 另外一个领域:关系数据库,由于以磁盘 IO 和锁同步数据安全为主,大多采用多线程同步 IO 。 |
95
dzhou121 2016-08-03 10:32:03 +08:00 4
@serial
GeekGao 说的” IO 阻塞与否跟编程语言没多大关系的“,我觉得是对的呀。 你举的 pymongo , pymysql , docker-py 都是阻塞的也没有错,因为刚好写库的人写成阻塞的了。也可以写基于 twisted, asyncio 的库呀,这样的库不就是非阻塞的了吗。 MySQL 的非阻塞库 https://github.com/aio-libs/aiomysql Mongo 的非阻塞库 https://github.com/mongodb/motor 再说白了,大多数语言的非阻塞不都是靠库来提供么,标准库也好,第三方库也好。 没有一个语言是万能的,总是根据你项目的需求选择最适合的语言。就说你认为是 toy 的 Wordpress ,一个个人博客的访问量而已,而且要部署方便, php 当然是比较好的选择,用 C 写也太 overkill 了吧。而且你说是 toy ,也只是从技术难度的角度上来说,但是从商业价值上来说, Wordpress 比很多技术难度高于它的项目要高很多吧。 最后说我的结论吧, Python 可以做非 toy 的项目,会遇到这样那样的问题,有坑要绕过去,但是有不用绕坑的编程语言吗?编程语言最终是来解决问题的,选择最适合你的问题的编程语言。 |
96
GeekGao 2016-08-03 10:35:21 +08:00 1
@liangmishi
看情况,假设你用的是 mysql ,如果是数据库表死锁了导致的,那么在解锁前你就查不了了。这跟 Python 、 django 框架没啥关系的。 还有种可能就是数据库连接资源被吃光了,无法释放多余的连接给你的 client ,发生这种情况就要找你们的 dba 看下查询提交状态了, kill 掉慢查询或重启…… |
98
honkew 2016-08-03 10:42:32 +08:00
变成月经贴来争论了
|
99
SlipStupig OP @liangmishi 反问一个问题,如果数据库挂了,还能不能读写数据?
|
100
YORYOR 2016-08-03 12:03:18 +08:00
翻页吧 python 慢 这个是事实,为了运维方便 从把 shell 迁到了 python ,之前分钟级别的处理变成了小时级
|