为什么 Py3k 要比 Py 2 慢?

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

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

5138 次点击
所在节点    Python
45 条回复
monsabre1
2015-05-12 20:54:24 +08:00
@lightening

热更新是函数型最主要那个目的
monsabre1
2015-05-12 20:55:37 +08:00
@yakczh

erlang无需停机 你见过听过电信定期停机更新吗
lightening
2015-05-12 21:01:41 +08:00
@monsabre1 Maybe. 但也可以用来提升代码可读性、惰性求值、方便并发。
laike9m
2015-05-12 22:02:34 +08:00
测试代码呢?
monsabre1
2015-05-12 22:30:02 +08:00
@lightening

并发也是优点(不过nodejs即便oo 并发也不错)
熟手开发效率高也是
可读性保留 特别是人员混杂的时候

好在python是脚本 多操纵引擎
FP OO 都没问题 都可以轻松控制住局面
kaneg
2015-05-12 22:30:18 +08:00
可能3主要是在语言层面增加了不少新功能, 2已经很稳定,所以在性能上不断优化的结果。
bdnet
2015-05-12 23:48:18 +08:00
3为什么就没用起来
monsabre1
2015-05-12 23:57:04 +08:00
python函数式如果不用map reduce filter
完全自己改写oo到fp
速度慢很多

别的语言估计一样 强扭的瓜不甜
baozijun
2015-05-13 00:00:48 +08:00
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
```
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

有何优势 可读性也不强
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啊
Feiox
2015-05-13 03:37:46 +08:00
,似乎歪楼了。。。。。为什么3比2满啊
livelazily
2015-05-13 07:52:27 +08:00
@Feiox http://stackoverflow.com/q/23453133/902058 这里有一个解释
其实 Google 搜下 python 3 slower than python 2 就有很多答案了
publicID001
2015-05-13 08:12:53 +08:00
@monsabre1 发代码请用gist
imn1
2015-05-13 10:32:24 +08:00
@monsabre1
另类一下
bin(sum(1 << (x << 1) for x in range(99))).lstrip('0b')
monsabre1
2015-05-13 11:01:17 +08:00
monsabre1
2015-05-13 11:02:14 +08:00
10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
908
10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
67
10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
69
imn1
2015-05-13 11:12:07 +08:00
@monsabre1
也就这个恰巧 10101... 可以这样写,其他问题估计就要另想了

ps
你用py2,要改写xrange,我在py3写的,所以直接用了range,不过应该还是比 f2(纯数字计算) 略慢
f1用递归肯定慢,应该想办法写成装饰器/yield,不过懒得搞了
monsabre1
2015-05-13 11:38:45 +08:00
@imn1

我意思是如果语言不原生支持函数型
有人如果强行写 比较吃力 性能不好 可读性也很差

说是卖弄技巧也不为过

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

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

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

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

© 2021 V2EX