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

33567 次点击
所在节点    Python
268 条回复
FrankHB
2016 年 8 月 16 日
@serial 没专业知识、眼界和历史常识撑腰,读空气无能也得有个限度。
本来这种口水问题见了无非是能渡几个是几个,剩下的我就是当×乎娱乐同等笑话,但既然诚心想当被科普的靶子就没法坐视不理了。

https://en.wikipedia.org/wiki/Esoteric_programming_language#Piet
需要更多干货打脸请自便。

二进制?哦, ENIAC 用的二进制?或者你能钦定 ENIAC 不是计算机?
常识:“计算机”这货 TM 本来就不管你毛线几进制,几进制无非是为了(不限于计算机)实现方便事后诸葛亮出来的, understand ?
还有你想说现在的哪个计算机用的什么 01 ?有点规范意识的话,你该不会还停留在目无 trap representation ,分不清 bit/byte/octet 的层次上吧?
再告诉你个常识,我上面说的位图是指的和光栅图对立的东西,是“位图”这个词的原意。
规范? Device-dependent bitmaps 在 API 以上你想要什么规范?或者你以为别人口中的位图就是 M$的 DIB 还是什么来着?
想用序列化格式偷换概念,还是太嫩了。
FrankHB
2016 年 8 月 16 日
得,撸点 parser 就叼毛自以为造完“编译器”、拿规范偷换概念不给 reference 、目无 ISA 和 ABI 直接 bb 错误组成原理概念的,一概以民科论处。再跳的通通按不尊重现役苦力的阶敌清算。
非技术话题不再这里废话。
FrankHB
2016 年 8 月 16 日
哦,抽了缩水了。更正:
我上面说的位图是光栅图的实现,是和矢量图对立的东西。
xuweitiger
2016 年 8 月 16 日
为啥好好的话不能好好说,看来“大神”都是神挡喷神佛挡喷佛啊,真是见识到了……
serial
2016 年 8 月 16 日
@FrankHB

你知道有个东西叫做 “编译器”? 你知道你的那些什么狗屁位图程序最终都要编译器编译成二进制 0 1 ?

学 python 学傻了,没事学点 C 语言。一点计算机常识都没有。

简直是对牛弹琴,连入门都没有。难道要我跟你从字节、页、映射开始讲起?
serial
2016 年 8 月 16 日
@FrankHB

> "常识:“计算机”这货 TM 本来就不管你毛线几进制,几进制无非是为了(不限于计算机)实现方便事后诸葛亮出来的, understand ?"

傻逼一个! 计算机用二进制是因为二进制对计算机来讲只有两个符号 0 和 1 ,是最简单的实现。这点常识都没有,真是个傻逼!

也真操了,这种傻逼说起话来还觉得自己挺懂一样。我再给你普及一下:计算机不只只用二进制 0 1 ,而且只懂加法,不懂减法、乘法、除法。明白了,菜鸟! (所有的其他运算通过移位、补码、溢出进行换算)

和你讲话真 TM 累!你不会连大一学生 C 语言的普及入门课程都没有上过吧。
palxex
2016 年 8 月 16 日
@FrankHB 该 B 就 B 吧。跟一个在到了 C 底层就认为再往下都是神圣不可动摇领域的有啥好讨论的么。这行也到了要靠老一代自己死掉来解决争端的时候了。
FrankHB
2016 年 8 月 16 日
@serial 你可知道你有资格钦定什么叫编译器?上面的东西光是喂鸡都够打你多少脸了。(不是我给的,自己翻什么叫 compiler 什么叫 source code ,包括 FSF 的观点上面都有提。)

还“两个符号 0 和 1 ,是最简单的实现”——你特么实现过计算机?没做过别在自己不了解的领域瞎 bb 。

还有……学 C ?这是我这几天看过最好笑的笑话。你不是 C 撸傻了吧,哪来的蜜汁自信在我面前提 C ?我给人校对 C11 和 N1570 的时候咋没发现 C 给你钦定什么 0 什么 1 了。(我看就你这态度这辈子是不用指望给 WG14 舔屁股了……)

看样子你自认为很懂 C 嘛。来来来,给我解释下, ISO C 对 basic source character set 跟 basic execution character set 分别钦定的理由?按你说的 0 和 1 就够的东西,为什么需要那么复杂?是不是说明 C 是辣鸡?

可惜下面“所有的其他运算通过移位、补码、溢出进行换算”就露马脚了。首先浮点打脸啪啪啪。然后就算是整数,哪个逗比 ISA 会拿这种东西“换算”?哦,强行说 C 是嘛,也行:

WG14 N1570
6.2.6.2/2
For signed integer types, the bits of the object representation shall be divided into three
groups: value bits, padding bits, and the sign bit. There need not be any padding bits;
signed char shall not have any padding bits. There shall be exactly one sign bit.
Each bit that is a value bit shall have the same value as the same bit in the object
representation of the corresponding unsigned type (if there are M value bits in the signed
type and N in the unsigned type, then M ≤ N). If the sign bit is zero, it shall not affect
the resulting value. If the sign bit is one, the value shall be modified in one of the
following ways:
— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value −(2M) (two ’ s complement);
— the sign bit has the value −(2M − 1) (ones ’ complement).
Which of these applies is implementation-defined, as is whether the value with sign bit 1
and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones ’
complement), is a trap representation or a normal value. In the case of sign and
magnitude and ones ’ complement, if this representation is a normal value it is called a
negative zero.

我甭管你的“补码”脑补成什么词性,告诉我你那坨玩意儿怎么兹瓷 padding bit 跟 trap representation 跟 negative zero 啊,蛤?

跟你说话真 TM 累,你不会连大一学生 C 语言的普及入门课程十有八九是冒牌得被我婊了几年了都不知道吧?
FrankHB
2016 年 8 月 16 日
@palxex 到了这份上就跟某人就不叫讨论而是单方面教育了。

除去科普意义依旧,这几天我成天撸比下有余的“底层”的东西(倒腾 opcode/modrm/sib/disp 之类)正不爽呢,正好换换口味……贴吧里矫正了点汇编=底层厨然而毫无波动,果然还是没有狠狠干几个自以为很懂 C 的顺手。
kamil
2016 年 8 月 17 日
@xuweitiger 神挡喷神佛挡喷佛,哈哈,手动赞
喷子喷的再多,还是个喷子,明白人一看自然高下立判,就像那段 c 风格的 js ,明显两种都没玩好,一瓶不满半瓶晃荡,还好意思出来卖弄只能说明脸皮厚
一次能 B 好多无脑喷子及傻逼跟风狗,这就是这个帖子的作用
wizardforcel
2016 年 8 月 17 日
@serial

[计算机用二进制是因为二进制对计算机来讲只有两个符号 0 和 1 ,是最简单的实现。 ]

是因为数字电路只认高电位和低电位,是最简单的实现。图灵机,或计算过程随便用什么进制都可以。人类也能够计算,你平常拿二进制计算嘛? naive 。

你的计算机很难让别人知道指物理实现还是概念模型。智障还是故意偷换概念??

[ 计算机不只只用二进制 0 1 ,而且只懂加法,不懂减法、乘法、除法。 ]

计算机懂加法??滚回去看加法器是怎么实现的。乘法器的确拿加法器实现,但加法器也不是凭空变出来的。

和你讲话真 TM 累!你不会连组成原理都没学过吧。。。
wizardforcel
2016 年 8 月 17 日
@serial

另外你最好拿本编译的书看看 delimiter (定界符)是啥意思。

你说的+-*/叫 operator (运算符),不叫 delimiter 。

我的 add 、 mul 叫做 token (标识符),也不叫 delimiter 。

delimiter 这种简单、固定的东西有利于机器扫描。你的式子前后那个括号就属于 delimiter 。

我需要扫描 token ,那是必然的。不扫描还能写啥 parser ?你的式子就只需要 delimiter ,不扫描其他的东西??

真是无知。
serial
2016 年 8 月 17 日
@FrankHB

你连 TMB 编译器最终编译成二进制都不知道,提 NMB 的编译器。好好睁大你的狗眼看清楚了:

“在数学和数字电路中,二进制( binary )数是指用二进制记数系统,即以 2 为基数的记数系统表示的数字。这一系统中,数通常用两个不同的符号 0 (代表零)和 1 (代表一)来表示。以 2 为基数代表系统是二进位制的。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(二进制位)。”

傻逼一个东西,你 TMB 一看就是没上过大学的菜逼。大学课堂哪怕是选修课,都有信号、电子电路的介绍。你 TMB 连与非门都没听说过吗?

知道与非门是什么吗?傻逼! 0 1 直接映射与非门的 “与” 和 “非”,懂了吗? 傻逼! 要不要老子给你贴贴三极管、放大器的电路图。

大学都没上过,在这里瞎逼逼你麻痹。
serial
2016 年 8 月 17 日
@ kamil

你是你妈的哪条狗,递归都不懂,出来秀你妈的逼。不懂递归,难道 TMB  不懂百度谷歌?
serial
2016 年 8 月 17 日
@ wizardforcel

> “另外你最好拿本编译的书看看 delimiter (定界符)是啥意思。 "

> "你说的+-*/叫 operator (运算符),不叫 delimiter 。 ”

你就是个傻逼, /^[A-Za-z_]\w{0,31}/ 这就是你这傻逼写出来的。你觉得这是运算符的意思?自己打自己的脸。你 TMB 自己写的解析程序都搞不懂原理?
serial
2016 年 8 月 17 日
@wizardforcel

“计算机懂加法??滚回去看加法器是怎么实现的。乘法器的确拿加法器实现,但加法器也不是凭空变出来的。”

加法器是 NMB 怎么变出来的? 你来说说计算机不懂加法,怎么做加法。傻逼。
wizardforcel
2016 年 8 月 17 日
@serial

[加法器是 NMB 怎么变出来的? 你来说说计算机不懂加法,怎么做加法]

你来说说计算机不懂乘法,怎么做乘法。乘法器拿加法器实现,计算机怎么就不懂乘法了??懂你 MB 。

[你觉得这是运算符的意思?自己打自己的脸。你 TMB 自己写的解析程序都搞不懂原理?]

谁给你钦定“必须用运算符”了??懂啥叫调用表达式和标识符嘛??

程序大了你不定义子过程??定义了子过程之后你的运算符够用??

不懂就玩你的前缀表达式去。

[不懂递归,难道 TMB  不懂百度谷歌?]

尾递归允许多个递归调用??你这“[parse(), parse(), parse()]”叫“出现在函数末尾”?

来来来,你手动把你那三个 parse()给我展成循环。
serial
2016 年 8 月 17 日
@wizardforcel

卧槽,你还真 TM 弱智啊。计算机不懂乘法,当然是靠加法移位+溢出+补码啊,这种常识都不知道。百度下谷歌下总可以吧。

你也没上过大学?

/^[A-Za-z_]\w{0,31}/ 这 TM 哪个是运算符?
serial
2016 年 8 月 17 日
@wizardforcel

扫描你妹的 token ,连 TMB 的 token 是什么意思都搞不清楚,还逼逼扫描器。记清楚了,扫描器扫描出来后,生成 token 对象,一般用元祖 (id, symbol-table) 记法表示。在 C 中一般用数组 + 指针实现,高阶语言可以使用 tuple + object / hashtable 实现。你就是个屁都不懂的傻逼。

哥给你贴上 <<Compilers: Principles, Techniques, and Tools>> (龙书) 第 5 页的原文,好好学习:

@FrankHB 还有你这个傻逼,看清楚了 “ the stream of characters ”:

-->

The first phase of a compiler is called lexical analysis or scanning. The lexical analyzer reads the stream of characters making up the source and groups the characters into meaningful sequences called lexemes. For each lexeme, the lexical analyzer produces as output a token of the form program

(token-name, attribute-value)

that it passes on to the subsequent phase, syntax analysis. In the token, the first component token-name is an abstract symbol that is used during syntax analysis, and the second component attribute-value points to an entry in the symbol table for this token.

<<Compilers: Principles, Techniques, and Tools>>

-->
FrankHB
2016 年 8 月 17 日
@wizardforcel 文法元素取决于语言,编译本身决定不了。看编译书也不会给你说清楚。
token 在此一般翻译成记号。标识符(identifier)是 token 的一种。而 delimiter 通常特指(中缀)分隔其它 token 的字符序列,本身不一定是 token 。
括号也可以设计成 punctuator 作为 token 的一种,但因为需要检查匹配所以一般不会做成 delimiter 。
operator 可以设计为 puncutator 也可以直接作为 identifier 。

@serial 我搞不懂是你语文水平拙计还是编译常识拙计了。
谁 TMD 教你编译只能是数字电路实现的?
谁 TMD 教你编译目标必须是二进制的拎出来,找找看中央编译局的同志是不是能怼死他。
逻辑拙计就算了,提数字电路还就会拎 gate level ,跟贴吧一个拎着卡诺图设计 IC 的逗风格真像……
看你组成原理常识都没的样子,我就不指望你听说过 RTL 了(不管是编译器里的那个还是 IC 设计里的那个)。
先进化到突触的延迟满足得了跟得上 bb 的内容是啥再扯蛋吧。一问三不知转移话题 yy 强行替人没上大学,一绕回去还不就没词儿怂了。我考察你的 C 的问题呢?咋不把 ENIAC 开除出“计算机”啊?
就你这反应要来面试,时序约束就炸了。
似乎你不仅懂 C ,还懂递归?来来来,给我把 C 的语义用μ-recursive function 撸一遍?

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

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

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

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

© 2021 V2EX