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

32579 次点击
所在节点    Python
268 条回复
FrankHB
2016-08-02 09:33:49 +08:00
哪里战了,不就是科普一些废话浪费口水罢了。倒是照例钓出个别对语言实现常识少根筋的的。(以下无涉勿对号入座。)

@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
2016-08-02 09:56:05 +08:00
@serial 有一点你说反了。装 X 的架构中,显示图形的是 X server ,而不是“客户端”。
likuku
2016-08-02 10:02:02 +08:00
@FrankHB 我来接力:"客户端” 是 X 应用程序,用户直接使用的是负责显示 GUI 和处理交互的 XServer
serial
2016-08-02 10:11:51 +08:00
@FrankHB

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

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

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

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

/手动匿名
FrankHB
2016-08-02 10:49:09 +08:00
@GeekGao 这里的出发点有两点:首先, native 这件事和性能本质上毫无关系;其次, native 也是相对而言的。是不是能更快,取决于实现的机制,而不是接口所在的具体层次。使用相对不 native 的接口的确可以给人造成慢的刻板印象,但现实中这主要错误的选型以及上层封装得太渣的锅。
x86 汇编背后的 ISA 一般计算机系统中的开发中不需要修改硬件实现的下界。这种层次的 native 仍然没有多少特殊性;像我所在的(硬件)项目就涉及实现 ISA ,于是 ISA 自然就不够 native 了。而对绝大多数软件项目来讲这个层次又太低了,实际根本不需要也不适合考虑这层东西。加上就像我所说的真没有性能更好的保证,所以这些东西和这个主题关心的东西无关。
besto
2016-08-02 10:51:25 +08:00
Python 效率不是问题,而是大项目很容易出意想不到的坑。
自己写写随意。
shliujing
2016-08-02 11:33:59 +08:00
我是来看评论的 0 0
serial
2016-08-02 11:46:53 +08:00
@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
2016-08-02 11:50:38 +08:00
根本没必要战吧,这楼里某人一看就没深入了解过 python ,连 tornado 兼容其他 async ioloop 和 motor 都不知道。三年 python 大概只是写爬虫之类的娱乐而已。
python 写服务非常有优势,现在 microservice 当道用 python 的真是多。不要总是傻乎乎的以国内的眼光看世界。有兴趣的可以去了解一下 uber 或者 pinterest 的 stack 。还动不动就大型系统,整个 v 站里估计数不出 3 个在大公司真正提出并领导搭建架构的。
R4rvZ6agNVWr56V0
2016-08-02 14:43:58 +08:00
@serial 建议你好好去阅读这些 driver 的源码(因为你总是说他们基于 httplib ,你呼它出来谈谈,问问它在这些 driver 实现里干啥呢),还有 IO 阻塞与否跟编程语言没多大关系的, OS 、各类服务 driver 不支持的话,众多编程语言一起哭吧。
Python 如果会讲话肯定会吐槽:“ C/C++原生撸 driver 本来就特么没有给俺做 none blocking 实现,怪我咯?”

建议你好好读一读 CSAPP 看看到底啥是 IO 多路复用,不理解再辩。
ragnaroks
2016-08-02 14:52:37 +08:00
评论语言好坏却不说应用场景,那基本可以认为此人没有从事过实际开发.
HappyTrail
2016-08-02 14:55:27 +08:00
of cause 是什么 (
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
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
2016-08-02 18:06:59 +08:00
@calease

你这水平,根本进不了我的开发组。
Ge4Los
2016-08-02 20:39:47 +08:00
@serial 这段对 Python 异步的解释,我是赞同的。通常异步 IO 库,对网络层的转调是异步。可后端如果挂了同步的 mysql 这类资源,就活脱脱的变成阻塞了。
你们的争论点好奇怪,名字都没对上号嘛。

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

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

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

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

© 2021 V2EX