为什么 Py3k 要比 Py 2 慢?

2015-05-12 15:27:23 +08:00
 Feiox

如果是各种 Pythonic 的列表处理,py3k 确实有优势。但感觉函数式写法越来越多。
但,跑各种 web 应用,却一直都会慢一些。难道是 unicode?我在 py2 中也使用了各种 unicode 啊 from __future__ import unicode_literals
还有,你们遇到过 py3k 的哪些坑,出来聊聊呗

5133 次点击
所在节点    Python
45 条回复
laotaitai
2015-05-12 16:23:34 +08:00
函数式? 哈哈哈! 我笑抽了!
lightening
2015-05-12 16:26:36 +08:00
@laotaitai 函数式是一种思想,什么语言都可以用函数式写法。
Feiox
2015-05-12 17:55:51 +08:00
@laotaitai 比如,从语言层面鼓励多使用列表、返回不可变对象、运用迭代等。都算是把。
@lightening 最大的愿望还是能解除对 lambda 的诸多限制。
clino
2015-05-12 18:02:29 +08:00
什么样的代码 3 比 2 慢?
还没开始用3,不过想了解下
kxxoling
2015-05-12 18:05:03 +08:00
@Feiox 函数式。。。 (¬д¬) reduce 差点就没了的说
caoyue
2015-05-12 18:14:50 +08:00
Python3 本来就比 Python2 慢吧
我记得 3.0 release 的时候官方文档都写了比 2.X 慢多少来着,现在是否有改善就不知道了=-=

另外本身不是函数式的语言大量不适当的使用「函数式风格」也会导致效率降低啊
Feiox
2015-05-12 18:21:33 +08:00
@caoyue 除了字符串的原因,为什么会慢呢?

@kxxoling 对呀,但也感觉 G 老爷子特别喜欢列表推导。
zhyu
2015-05-12 18:33:16 +08:00
不如用 cProfile 看看哪里慢?
caoyue
2015-05-12 18:37:23 +08:00
@Feiox
水平太低,我也不知道为什么会慢=-=

很少有推荐使用 map 、filter 来替代 list comprehensions 的吧,我记得之前 Google 的 Python Style Guide 是禁止使用 map 的
monsabre1
2015-05-12 18:39:54 +08:00
@lightening

乱讲 你用java写个全函数式编程
neoblackcap
2015-05-12 19:07:21 +08:00
Py3k刚开始是慢,至少3.1, 3.2这些是会比2.7慢的,然后3.4就开始慢慢上来了。至于为什么慢?好像是跟新式类的实现有关的,没错就是那个object
BOYPT
2015-05-12 19:09:58 +08:00
不是吧,不用map filter写python还有啥意义。
kxxoling
2015-05-12 19:19:37 +08:00
@BOYPT map 和 filter 不受影响,只有 reduce 差点被砍了,不过开发者的反对挺强烈的。
whatisnew
2015-05-12 19:20:44 +08:00
@lightening 你用 java 写一个试试
lightening
2015-05-12 19:55:47 +08:00
@monsabre1
@whatisnew

不要改写任何变量,用函数调用代替变量赋值,用递归替代循环。全函数不可能(比如和外部系统交互),但是大量应用函数编程思想完全没问题。
phx13ye
2015-05-12 20:18:42 +08:00
不知道有啥好笑的,oop就不能fp?


Functional programming in non-functional languages

It is possible to use a functional style of programming in languages that are not traditionally considered functional languages.[42] For example, both D and Fortran 95 explicitly support pure functions.[43]

First-class functions have slowly been added to mainstream languages. For example, in early 1994, support for lambda, filter, map, and reduce was added to Python. Then during the development of Python 3000, Guido van Rossum called for the removal of these features.[44] However, he later changed his mind, and only reduce was removed,[45] though it remains accessible via the functools standard library module.[46] First-class functions were also introduced in PHP 5.3, Visual Basic 9, C# 3.0, and C++11[citation needed].

In Java, anonymous classes can sometimes be used to simulate closures;[47] however, anonymous classes are not always proper replacements to closures because they have more limited capabilities.[48] Java 8 supports lambda expressions as a replacement for some anonymous classes.

摘自维基百科
monsabre1
2015-05-12 20:49:24 +08:00
@lightening

全函数才能热更新
这是erlang用在电信的一个原因
yakczh
2015-05-12 20:51:05 +08:00
那是不是象php一样,改了代码就能立马生效了?
lightening
2015-05-12 20:51:46 +08:00
@monsabre1 函数编程又不是只有热更新一个目的
monsabre1
2015-05-12 20:53:27 +08:00
@phx13ye

c++ python都是多范式
java即便模拟也是伪的 也会很丑陋

java是标准oo helloworld也要写类
多范式想彻底函数型 必须先有过程型
话说java能过程型写个helloworld吗

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

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

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

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

© 2021 V2EX