如果是各种 Pythonic 的列表处理,py3k 确实有优势。但感觉函数式写法越来越多。
但,跑各种 web 应用,却一直都会慢一些。难道是 unicode?我在 py2 中也使用了各种 unicode 啊 from __future__ import unicode_literals
还有,你们遇到过 py3k 的哪些坑,出来聊聊呗
1
laotaitai 2015-05-12 16:23:34 +08:00
函数式? 哈哈哈! 我笑抽了!
|
2
lightening 2015-05-12 16:26:36 +08:00
@laotaitai 函数式是一种思想,什么语言都可以用函数式写法。
|
3
Feiox OP |
4
clino 2015-05-12 18:02:29 +08:00
什么样的代码 3 比 2 慢?
还没开始用3,不过想了解下 |
6
caoyue 2015-05-12 18:14:50 +08:00
Python3 本来就比 Python2 慢吧
我记得 3.0 release 的时候官方文档都写了比 2.X 慢多少来着,现在是否有改善就不知道了=-= 另外本身不是函数式的语言大量不适当的使用「函数式风格」也会导致效率降低啊 |
8
zhyu 2015-05-12 18:33:16 +08:00
不如用 cProfile 看看哪里慢?
|
9
caoyue 2015-05-12 18:37:23 +08:00
@Feiox
水平太低,我也不知道为什么会慢=-= 很少有推荐使用 map 、filter 来替代 list comprehensions 的吧,我记得之前 Google 的 Python Style Guide 是禁止使用 map 的 |
10
monsabre1 2015-05-12 18:39:54 +08:00
|
11
neoblackcap 2015-05-12 19:07:21 +08:00
Py3k刚开始是慢,至少3.1, 3.2这些是会比2.7慢的,然后3.4就开始慢慢上来了。至于为什么慢?好像是跟新式类的实现有关的,没错就是那个object
|
12
BOYPT 2015-05-12 19:09:58 +08:00
不是吧,不用map filter写python还有啥意义。
|
13
kxxoling 2015-05-12 19:19:37 +08:00 via iPhone
@BOYPT map 和 filter 不受影响,只有 reduce 差点被砍了,不过开发者的反对挺强烈的。
|
14
whatisnew 2015-05-12 19:20:44 +08:00 via iPhone
@lightening 你用 java 写一个试试
|
15
lightening 2015-05-12 19:55:47 +08:00
|
16
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. 摘自维基百科 |
17
monsabre1 2015-05-12 20:49:24 +08:00
|
18
yakczh 2015-05-12 20:51:05 +08:00
那是不是象php一样,改了代码就能立马生效了?
|
19
lightening 2015-05-12 20:51:46 +08:00
@monsabre1 函数编程又不是只有热更新一个目的
|
20
monsabre1 2015-05-12 20:53:27 +08:00
@phx13ye
c++ python都是多范式 java即便模拟也是伪的 也会很丑陋 java是标准oo helloworld也要写类 多范式想彻底函数型 必须先有过程型 话说java能过程型写个helloworld吗 |
21
monsabre1 2015-05-12 20:54:24 +08:00
|
23
lightening 2015-05-12 21:01:41 +08:00
@monsabre1 Maybe. 但也可以用来提升代码可读性、惰性求值、方便并发。
|
24
laike9m 2015-05-12 22:02:34 +08:00
测试代码呢?
|
25
monsabre1 2015-05-12 22:30:02 +08:00
@lightening
并发也是优点(不过nodejs即便oo 并发也不错) 熟手开发效率高也是 可读性保留 特别是人员混杂的时候 好在python是脚本 多操纵引擎 FP OO 都没问题 都可以轻松控制住局面 |
26
kaneg 2015-05-12 22:30:18 +08:00
可能3主要是在语言层面增加了不少新功能, 2已经很稳定,所以在性能上不断优化的结果。
|
27
bdnet 2015-05-12 23:48:18 +08:00 via iPhone
3为什么就没用起来
|
28
monsabre1 2015-05-12 23:57:04 +08:00
python函数式如果不用map reduce filter
完全自己改写oo到fp 速度慢很多 别的语言估计一样 强扭的瓜不甜 |
29
baozijun 2015-05-13 00:00:48 +08:00
|
30
monsabre1 2015-05-13 00:09:02 +08:00
```python
import datetime def add(x): return x*100 + 1 def count(x): return x + 1 def f1(a,b): if b==99: return a else: return f1(add(a),count(b)) def f2(): a=0 for x in xrange(1,100): a=a*100+1 return a def main(): starttime = datetime.datetime.now() print f1(1,1) #fp endtime = datetime.datetime.now() print (endtime - starttime).microseconds starttime = datetime.datetime.now() print f2() #oo endtime = datetime.datetime.now() print (endtime - starttime).microseconds if __name__=='__main__': main() ``` 输出 ``` 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 1485 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 116 ``` |
31
monsabre1 2015-05-13 00:24:36 +08:00
看不出 如果语言如果不原生支持 自己非要改写
def add(x): return x*100 + 1 def count(x): return x + 1 def f1(a,b): if b==99: return a else: return f1(add(a),count(b)) 这一坨比 def f2(): a=0 for x in xrange(1,100): a=a*100+1 return a 有何优势 可读性也不强 |
32
monsabre1 2015-05-13 01:20:49 +08:00
试试胜于雄辩
哪位改写 def f2(): a=0 for x in xrange(1,100): a=a*100+1 return a 到易读简洁的functional programming 别用map reduce filter lamda啊 |
33
Feiox OP ,似乎歪楼了。。。。。为什么3比2满啊
|
34
livelazily 2015-05-13 07:52:27 +08:00
@Feiox http://stackoverflow.com/q/23453133/902058 这里有一个解释
其实 Google 搜下 python 3 slower than python 2 就有很多答案了 |
35
publicID001 2015-05-13 08:12:53 +08:00 via Android
@monsabre1 发代码请用gist
|
36
imn1 2015-05-13 10:32:24 +08:00
|
37
monsabre1 2015-05-13 11:01:17 +08:00
|
38
monsabre1 2015-05-13 11:02:14 +08:00
10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
908 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 67 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 69 |
39
imn1 2015-05-13 11:12:07 +08:00
@monsabre1
也就这个恰巧 10101... 可以这样写,其他问题估计就要另想了 ps 你用py2,要改写xrange,我在py3写的,所以直接用了range,不过应该还是比 f2(纯数字计算) 略慢 f1用递归肯定慢,应该想办法写成装饰器/yield,不过懒得搞了 |
42
monsabre1 2015-05-13 12:11:17 +08:00
|
43
Feiox OP @livelazily 我在 Google 搜到了很多解释。我这里是想听听大家的意见。
|
44
Feiox OP @monsabre1 对。虽然我喜欢函数范式,但在几万十几万行多人协作、业务逻辑多余算法的代码中完全使用函数式,我总感觉一般人驾驭不了。但核心算法用函数式写确实够漂亮。
另外,开发中不一定非 oo 即 函数,Python 的列表推导、lambda、map 等写法 都是可以写出简洁健壮的代码。 |
45
slideclick 2015-05-20 16:34:25 +08:00
python3的列表推导主要是节省内存吧。unicode估计是个原因,ascII码不再是一个byte.另:Python 的列表推导真心比map/filter好看。。
|