V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
SlipStupig
V2EX  ›  Python

最近研究 python 的一个小失落

  •  2
     
  •   SlipStupig · 2016-08-01 08:02:33 +08:00 · 31280 次点击
    这是一个创建于 3034 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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();
    

    • -O 所谓的优化就是删除内置的__debug__这个方法,然后禁用从网络引用包,体积能变下就是删除这两块的代码,所以变小的效果也不明显

    • -OO 是在-O 基础上删除所有的文档字符串,如果你定义了个 """ Comment """,将会被 python 删除掉(前段时间被坑了,找不到变量)

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

    第 1 条附言  ·  2016-08-02 07:24:15 +08:00
    我仅仅只是说一下我的小发现,结果触发了语言大战,这个是我完全没想到的,希望大家不要再说语言好坏了
    第 2 条附言  ·  2016-08-03 14:35:27 +08:00
    本来我就说个小发现,然后早上起来我突然发现我就就有一个金币,各位大侠我承认 PHP 是世界上最好的语言,各位别吵了!
    第 3 条附言  ·  2016-08-15 18:02:49 +08:00
    各位大仙能不能停手啊,访问都破万了.....
    268 条回复    2016-11-08 23:23:43 +08:00
    1  2  3  
    wangxn
        1
    wangxn  
       2016-08-01 08:43:54 +08:00 via Android
    你理解错了…… slightly 是副词,意为这个选项可以轻微优化生成的字节码。
    wangxn
        2
    wangxn  
       2016-08-01 08:48:54 +08:00 via Android   ❤️ 1
    以 CPython 的运行速度,做优化几乎是没什么作用的。瓶颈这么多,随便一个都拖后腿了。例如基于栈的字节码,简陋的 mark-sweep GC , GIL ,太多了。
    RqPS6rhmP3Nyn3Tm
        3
    RqPS6rhmP3Nyn3Tm  
       2016-08-01 08:55:48 +08:00 via Android
    想快还得 JIT 啊,默认解释器就是慢没办法
    serial
        4
    serial  
       2016-08-01 09:00:02 +08:00   ❤️ 2
    python 就不要求速度了,如果你不会 Shell ,可以拿 python 做自动化脚本 --- 特别是处理正则表达式。其他方面, python 都能做,做的都很垃圾 --- CPU 计算慢, IO 并发低,特别是标准库写的特别差。
    kideny
        5
    kideny  
       2016-08-01 09:02:21 +08:00
    @serial 为什么,每一门火的语言,都会有人喷啊。百度,不是用 python 很多的嘛!
    serial
        6
    serial  
       2016-08-01 09:07:49 +08:00   ❤️ 1
    @kideny

    这不是喷,这叫事实。每个语言都有其位置和商业模式。 python 的位置和商业模式就是: perl shell 替代品的运维脚本、非专业程序员的数据师的建模脚本。其他, python 只是重在参与。
    SlipStupig
        7
    SlipStupig  
    OP
       2016-08-01 09:09:11 +08:00   ❤️ 2
    @kideny 这种人无视掉,估计从来没有写过超过 1000 行代码,你跟他没什么可争论的。

    @wangxn 英语不好理解错误,抱歉
    serial
        8
    serial  
       2016-08-01 09:10:14 +08:00   ❤️ 3
    @kideny

    我就拿图像识别来说吧, python 的库非常多,(甚至神经网络的库都一大堆)。其中很多都是某些科学领域,但是非专业程序员写的,因为 python 对编程的要求门槛低。

    但是当要把这些图像识别之类的程序拿来做服务,商用的时候,都会转用 C/C++ 来重写。 python 只是数学家提供的一个算法描述,它的速度不适合应用。
    wander2008
        9
    wander2008  
       2016-08-01 09:12:41 +08:00 via iPhone
    @serial 老到之人。
    wizardforcel
        10
    wizardforcel  
       2016-08-01 09:14:38 +08:00
    @serial 不就是速度慢嘛?? matlab 和 r 速度更慢,不照样有搞数据的人在用??
    kingmo888
        11
    kingmo888  
       2016-08-01 09:22:04 +08:00
    喷 python 就喷吧。
    python 的定位能与 R 等同,高于 matlab 。
    strwei
        12
    strwei  
       2016-08-01 09:38:43 +08:00 via iPhone
    php 是全世界。。。。。(逃
    xueqt
        13
    xueqt  
       2016-08-01 09:44:10 +08:00
    喷子到处都有,无视就好
    ihciah
        14
    ihciah  
       2016-08-01 09:45:45 +08:00 via iPhone
    喷语言没有任何意义
    mengzhuo
        15
    mengzhuo  
       2016-08-01 09:51:33 +08:00   ❤️ 1
    @serial 哈哈哈哈,这嘴(不)炮(动手)能力满点啊~
    用 Python 做过两个游戏逻辑服务的表示, Python 的理念是,不够就堆机器。
    扯什么性能,等你用 C*开发完,黄花菜都凉了。
    yangtukun1412
        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."
    WangYanjie
        17
    WangYanjie  
       2016-08-01 10:20:23 +08:00
    哪里告诉你可以提高性能了, help
    est
        18
    est  
       2016-08-01 10:21:02 +08:00   ❤️ 4
    当年大家也觉得 C 语言是做模型的,真正要“工业级”效率还是汇编。呵呵。
    Ahri
        19
    Ahri  
       2016-08-01 10:28:14 +08:00
    Python 是有点慢, R 和 MATLAB 是真慢。
    WhiteT
        20
    WhiteT  
       2016-08-01 10:35:33 +08:00
    @serial Python 性能确实不如 C/C++ ,但现在的总体趋势难道不是提高机器硬件的水平以节约程序员的时间么?特别是处于业务扩张型的公司。不然为何如今那么多新兴互联网公司要选择 Python ?还是你觉得与其节约你的时间,还是节约机器开销更划算?当然我也同意随着用户量的提升,业务的稳定,转底层语言优化性能是个正确的选择,但这也需要平衡一下使用底层语言开发的成本和买机器的成本那个更低。而且私以为用户量到了因语言导致的性能瓶颈的公司并没有多少。
    Felldeadbird
        21
    Felldeadbird  
       2016-08-01 10:39:13 +08:00
    要性能还是要优雅的 py ,看你怎样看了。
    SlipStupig
        22
    SlipStupig  
    OP
       2016-08-01 10:44:50 +08:00   ❤️ 3
    @Felldeadbird 最近在看 JIT ,大致就是将 Bytecode 转成 LLVM IR 然后转成汇编,现在像 pyston 和 numba 都是这么做的,速度提升还不错,更好的是 PyPy 但是对一些扩展库兼容的不好,总的来说性能和优雅是可以兼顾的,但是需要一定代价!
    GeekGao
        23
    GeekGao  
       2016-08-01 10:45:47 +08:00
    直接操作寄存器、 x86 指令码快更 native ,你们倒是 coding 去啊,呵呵呵。
    GeekGao
        24
    GeekGao  
       2016-08-01 10:49:57 +08:00
    @serial 照你这么说 Youtbue 、 Quora 、 Dropbox 、 NASA … 哭晕在厕所了。 OpenStack 应该用 C 重撸了……
    ainimuyan
        25
    ainimuyan  
       2016-08-01 10:55:23 +08:00   ❤️ 1
    serial 说的是事实,很多公司是都在用 python ,但是应用场景不同, python 也确实构建了很多大型项目,但是侧重点不同,别为了喷而喷
    GeekGao
        26
    GeekGao  
       2016-08-01 10:57:48 +08:00
    “ python 都能做,做的都很垃圾 --- CPU 计算慢, IO 并发低,特别是标准库写的特别差” 请问这是啥事实,有论证么?
    某些同志凭感官就抛出 [事实] 二字也真是醉了。
    clino
        27
    clino  
       2016-08-01 10:57:57 +08:00
    你如果很在乎性能就不应该用纯 python,至少要用 python 配合其他语言来做
    python 比较强的还是自带电池多,开发效率高
    像想榨干硬件性能,或者大的系统之类的场合,都用 python 肯定不合适
    GeekGao
        28
    GeekGao  
       2016-08-01 11:00:01 +08:00
    @clino 同意这位同志的语录:你如果很在乎性能就不应该用纯 python,至少要用 python 配合其他语言来做
    justou
        29
    justou  
       2016-08-01 11:13:24 +08:00
    除了掌握一些 pythonic 的编程技巧提升程序的效率外, 大幅提升 python 执行效率的办法多的是啊,
    感觉比较灵活的还是在 cython 中 C/C++, python 混编, 灵活跟效率自己平衡
    luluuulu4848
        30
    luluuulu4848  
       2016-08-01 11:25:27 +08:00
    解释性的语言 性能都没有编译性语言快啊。。。不知道你们在争什么,解释性语言就是开发的快成本低,有不是所有应用都需要很快,专业软件用 C++去重写去 肯定快
    zmj1316
        31
    zmj1316  
       2016-08-01 11:28:00 +08:00
    python 属于写的爽运行起来痛苦的那种,需要性能要不上 pypy 这种 JIT ,要不就用 C/C++呗
    @serial 说的没什么错,被喷表示心疼
    a412739861
        32
    a412739861  
       2016-08-01 11:38:17 +08:00
    @zmj1316 写起来爽,运行起来痛苦+1 …………
    wuxqing
        33
    wuxqing  
       2016-08-01 11:52:13 +08:00
    所有,我现在都是 c 封装成函数, python 调用
    jjx
        34
    jjx  
       2016-08-01 15:55:29 +08:00
    @zmj1316

    什么叫没有错,科学计算/数据分析的底层库如 numpy/pandas 等都是高度优化的,大部分都直接用 cython 写,正是因为有了这些高度优化的底层库,才能让业务人员解脱出来, 喷的完全不在点上
    serial
        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 这些系统语言的战场。
    jjx
        36
    jjx  
       2016-08-01 21:32:07 +08:00   ❤️ 1
    gevent 惨被无视, 年龄堪比 java 的 twisted , 可以说时 asyncio 的原型也惨被无视
    tairan2006
        37
    tairan2006  
       2016-08-01 21:37:55 +08:00   ❤️ 2
    @serial 有点纸上谈兵了吧。当年腾讯买断偷菜版权,每个月收入数千万,同时在线数亿人,不就是靠着服务器(好像还是 windows 服务器)堆起来的么…时间根本来不及搞什么优化,不照样挺过来了。

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

    至于说堆机器的。。。一方面你考虑过你应用的本身最多能堆多少台机器么?(说没有上限的可以闭嘴了,我不信你的每台机器可以独立完成所有业务);另外一方面,没种语言都有自己的适应场景,用 A 语言堆 100 台机器才能完成的,换 B 语言很有可能 10 台就搞定了
    aisk
        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 如何,我猜您一定会说,切,连操作系统都不能写,好意思说自己是编程语言么?
    aisk
        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 么?
    aisk
        43
    aisk  
       2016-08-01 23:37:23 +08:00
    hard2reg
        44
    hard2reg  
       2016-08-02 00:29:02 +08:00
    胶水语言嘛!
    cszhiyue
        45
    cszhiyue  
       2016-08-02 01:22:15 +08:00
    Mirage09
        46
    Mirage09  
       2016-08-02 01:28:03 +08:00 via iPhone
    终于理解为什么会有 php 是最好的语言这个梗了..
    VYSE
        47
    VYSE  
       2016-08-02 01:28:06 +08:00
    哎用了 PYPY,结果用了递归跑一段时间就 crash,只能换回,速度成大问题
    SlipStupig
        48
    SlipStupig  
    OP
       2016-08-02 01:42:24 +08:00
    @VYSE 目前 lxml 在 Pypy 上还是跑不起来
    shyling
        49
    shyling  
       2016-08-02 01:50:07 +08:00 via iPad
    脚本小子。。
    mathgl
        50
    mathgl  
       2016-08-02 02:19:11 +08:00
    @SlipStupig 5.3 以上的听说可以了。原来主要是 cpyext 的问题。
    mathgl
        51
    mathgl  
       2016-08-02 02:24:25 +08:00
    @jjx twisted 第一个版本应该是 02 年左右的事。比 java 稍慢些。

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

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

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

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

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

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

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

    先搞懂什么是 Linux ,菜鸟
    serial
        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 年,你那点水平连入门都没有。
    serial
        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 。
    serial
        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 。
    FrankHB
        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 。多数其它语言根本就没能耐管这个。
    FrankHB
        62
    FrankHB  
       2016-08-02 09:56:05 +08:00
    @serial 有一点你说反了。装 X 的架构中,显示图形的是 X server ,而不是“客户端”。
    likuku
        63
    likuku  
       2016-08-02 10:02:02 +08:00
    @FrankHB 我来接力:"客户端” 是 X 应用程序,用户直接使用的是负责显示 GUI 和处理交互的 XServer
    serial
        64
    serial  
       2016-08-02 10:11:51 +08:00
    @FrankHB

    有意思的是,客户怎么看到?从哪里看到?
    serial
        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 库和算法程序。
    FrankHB
        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 交互。没有公开协议。
    GeekGao
        67
    GeekGao  
       2016-08-02 10:32:37 +08:00
    @serial 同学,非阻塞 vs 异步是俩种概念额…… 不明白为啥又把各路框架、性能扯到可移植性来了。
    @FrankHB 这里说的 native 指的是 x86 汇编…没深入研究过 SIMD 指令集,极端的说,比起虚拟机语言,操作指令集让性能更可控而已
    flyingghost
        68
    flyingghost  
       2016-08-02 10:33:38 +08:00
    python 烂,用过的都知道。

    但其实还有一种比 python 更烂的语言。烂到什么境界?所有的程序员基本对它都持鄙夷、吐槽、咒骂的态度。
    语言执行效率那叫一个低,人家语言都在毫秒级拼个你死我活,它一般一个任务执行时间都以小时来计,大厂和国企搞不好是以天来做单位。
    但胜在开发效率高。高,真心高。任何事,不超过三句话。
    每天剩下的时间,就可以用来看新闻、打游戏、逛 1024 。

    这门语言叫做:老板语言、 leader 语言、项目经理语言。

    作为一枚程序员,你有木有一边诅咒一边向往啊?

    /手动匿名
    FrankHB
        69
    FrankHB  
       2016-08-02 10:49:09 +08:00
    @GeekGao 这里的出发点有两点:首先, native 这件事和性能本质上毫无关系;其次, native 也是相对而言的。是不是能更快,取决于实现的机制,而不是接口所在的具体层次。使用相对不 native 的接口的确可以给人造成慢的刻板印象,但现实中这主要错误的选型以及上层封装得太渣的锅。
    x86 汇编背后的 ISA 一般计算机系统中的开发中不需要修改硬件实现的下界。这种层次的 native 仍然没有多少特殊性;像我所在的(硬件)项目就涉及实现 ISA ,于是 ISA 自然就不够 native 了。而对绝大多数软件项目来讲这个层次又太低了,实际根本不需要也不适合考虑这层东西。加上就像我所说的真没有性能更好的保证,所以这些东西和这个主题关心的东西无关。
    besto
        70
    besto  
       2016-08-02 10:51:25 +08:00
    Python 效率不是问题,而是大项目很容易出意想不到的坑。
    自己写写随意。
    shliujing
        71
    shliujing  
       2016-08-02 11:33:59 +08:00
    我是来看评论的 0 0
    serial
        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 ,就立刻变成一个阻塞访问,排队问题立马显现。
    calease
        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 个在大公司真正提出并领导搭建架构的。
    GeekGao
        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 多路复用,不理解再辩。
    ragnaroks
        75
    ragnaroks  
       2016-08-02 14:52:37 +08:00
    评论语言好坏却不说应用场景,那基本可以认为此人没有从事过实际开发.
    HappyTrail
        76
    HappyTrail  
       2016-08-02 14:55:27 +08:00
    of cause 是什么 (
    serial
        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!
    serial
        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
    serial
        79
    serial  
       2016-08-02 18:06:59 +08:00
    @calease

    你这水平,根本进不了我的开发组。
    Ge4Los
        80
    Ge4Los  
       2016-08-02 20:39:47 +08:00
    @serial 这段对 Python 异步的解释,我是赞同的。通常异步 IO 库,对网络层的转调是异步。可后端如果挂了同步的 mysql 这类资源,就活脱脱的变成阻塞了。
    你们的争论点好奇怪,名字都没对上号嘛。
    xiahei
        81
    xiahei  
       2016-08-02 21:36:21 +08:00
    实力上演舌战群儒。年度精彩大戏。
    jjx
        82
    jjx  
       2016-08-02 21:46:48 +08:00
    @Ge4Los

    对什么呀, 根本不在点上, 真正做事的 worker 都是阻塞的, 异步协程的作用主要在接入层面,接入更多的请求, 完成依赖于实际做事的 worker, 接入的多, 相应的就部署更多 worker

    这帖子完全没有讨论的必要了
    serial
        83
    serial  
       2016-08-02 21:50:34 +08:00
    @jjx

    你的进程、线程都被 mysql 、 mongodb 阻塞了,还接入更多请求。我问问,你拿什么接入?
    Ge4Los
        84
    Ge4Los  
       2016-08-02 22:04:25 +08:00
    @jjx 你这算取名问题吧。后端用阻塞服务和接入层本身外用 epoll 异步有啥关系。
    接入层和后端之间若用了同步,对外接入用异步 io 也没用啊。
    归根结底还是取名字问题。 摊手。
    sammiriam
        85
    sammiriam  
       2016-08-02 22:05:22 +08:00 via Android   ❤️ 1
    楼主一不小心搞了个大新,哦不,是大热帖
    GeekGao
        86
    GeekGao  
       2016-08-02 22:06:40 +08:00   ❤️ 1
    @serial 放一堆链接有啥用,明眼人一看就知道你吐槽的东西根本就不在点子上
    首先要搞懂操作系统基本知识、并发、异步基本的东西再辩吧。

    不是贴的文字内容越多,越有道理的。
    jjx
        87
    jjx  
       2016-08-02 22:16:29 +08:00
    @serial

    你这句话说的就没有讨论的必要了
    GeekGao
        88
    GeekGao  
       2016-08-02 22:37:19 +08:00
    不管你说啥,俺就一个观点: [ IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧]

    没必要把一些库搬出来证明啥,其实啥也证明不了。也麻烦你仔细看俺跟你辩的到底是啥嘛。

    ps:在网络上话多措辞强硬有得罪请见谅。希望接下来的辩论,不会让 v2 风气变得太差。
    窃以为这种问题帖要学术些、实证些而非诡辩、争吵。伤人不太了。
    GeekGao
        89
    GeekGao  
       2016-08-02 22:37:58 +08:00
    @serial 忘记 at 了
    liangmishi
        90
    liangmishi  
       2016-08-02 23:48:31 +08:00 via Android
    @GeekGao python web 的初学者从头看到尾最后还是没明白,一直在刷新看看有没有新的回复。请教一下,如果当前请求的数据库查询阻塞了,那是不是其他请求就没办法做查询了?
    谢谢
    martinsu
        91
    martinsu  
       2016-08-03 02:14:33 +08:00
    专业程序员 = 专业技工 ?
    非专业程序员 = 科学家 ?
    serial
        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 。
    serial
        93
    serial  
       2016-08-03 09:15:30 +08:00
    @GeekGao

    有道理就讲出来,没道理就别 BB 。说一堆无用的废话 P 话,只能显得你很 LOW 。
    GeekGao
        94
    GeekGao  
       2016-08-03 10:21:38 +08:00
    @serial 你 bb 那么多能证明啥,证明你完虐 Python ,怒骂设计不合理 还是你智力有很高? 傻逼
    dzhou121
        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 的项目,会遇到这样那样的问题,有坑要绕过去,但是有不用绕坑的编程语言吗?编程语言最终是来解决问题的,选择最适合你的问题的编程语言。
    GeekGao
        96
    GeekGao  
       2016-08-03 10:35:21 +08:00   ❤️ 1
    @liangmishi
    看情况,假设你用的是 mysql ,如果是数据库表死锁了导致的,那么在解锁前你就查不了了。这跟 Python 、 django 框架没啥关系的。
    还有种可能就是数据库连接资源被吃光了,无法释放多余的连接给你的 client ,发生这种情况就要找你们的 dba 看下查询提交状态了, kill 掉慢查询或重启……
    GeekGao
        97
    GeekGao  
       2016-08-03 10:36:30 +08:00
    @dzhou121 终于有明白人粗来说话了~ 唉.
    honkew
        98
    honkew  
       2016-08-03 10:42:32 +08:00
    变成月经贴来争论了
    SlipStupig
        99
    SlipStupig  
    OP
       2016-08-03 12:02:02 +08:00
    @liangmishi 反问一个问题,如果数据库挂了,还能不能读写数据?
    YORYOR
        100
    YORYOR  
       2016-08-03 12:03:18 +08:00
    翻页吧 python 慢 这个是事实,为了运维方便 从把 shell 迁到了 python ,之前分钟级别的处理变成了小时级
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1253 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:56 · PVG 01:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.