论坛首页 编程语言技术论坛

python中是否可以实现'tail-call elimination'的优化

浏览 13131 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-14  
这个我就不懂了。应该是开销不大吧?
0 请登录后投票
   发表时间:2007-02-15  
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。
0 请登录后投票
   发表时间:2007-02-26  
cookoo 写道
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。


哦,原来这样,为什么不鼓励写loop呢,还有就是python中的异常开销是不是不大?
0 请登录后投票
   发表时间:2007-03-02  
Arbow 写道
我说python的异常处理是不是开销不大?Java里面可不敢这样搞


呵呵,python in nutshell 有这么一句

引用

In Python, exceptions are considered appropriate whenever they make a program simpler and more robust, even if that means that exceptions are raised rather frequently
0 请登录后投票
   发表时间:2007-06-11  
simohayha 写道
cookoo 写道
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。


哦,原来这样,为什么不鼓励写loop呢,还有就是python中的异常开销是不是不大?

因为传统上循环总需要个计数器,也就是side effect拉。所以FP鼓励用递归或list comprehension,有点洁癖之嫌吧?
0 请登录后投票
   发表时间:2007-06-11  
cookoo 写道
simohayha 写道
cookoo 写道
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。


哦,原来这样,为什么不鼓励写loop呢,还有就是python中的异常开销是不是不大?

因为传统上循环总需要个计数器,也就是side effect拉。所以FP鼓励用递归或list comprehension,有点洁癖之嫌吧?
恩,map的存在可能也是一个原因.
0 请登录后投票
   发表时间:2007-06-11  
cookoo 写道
simohayha 写道
cookoo 写道
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。


哦,原来这样,为什么不鼓励写loop呢,还有就是python中的异常开销是不是不大?

因为传统上循环总需要个计数器,也就是side effect拉。所以FP鼓励用递归或list comprehension,有点洁癖之嫌吧?

至少有一个最新的理由:
函数式的列表操作(map/reduce/filter)是可以拆分的
比如reduce,你可以把一个大列表分成几个小列表,分别对它们做reduce,得到的结果放进同一个列表再做reduce,效果是一样的
map,更是如此
filter,同样
所以你就可以把“分解成小列表的操作”放在几个核上运行
这样就可以充分利用多核的计算能力
0 请登录后投票
   发表时间:2007-06-12  
gigix 写道
cookoo 写道
simohayha 写道
cookoo 写道
不支持也没什么,Ruby也没有,Java spec也不要求。尾递归就是个loop, 直接写loop好了。FP不鼓励写loop那是另外一回事。


哦,原来这样,为什么不鼓励写loop呢,还有就是python中的异常开销是不是不大?

因为传统上循环总需要个计数器,也就是side effect拉。所以FP鼓励用递归或list comprehension,有点洁癖之嫌吧?

至少有一个最新的理由:
函数式的列表操作(map/reduce/filter)是可以拆分的
比如reduce,你可以把一个大列表分成几个小列表,分别对它们做reduce,得到的结果放进同一个列表再做reduce,效果是一样的
map,更是如此
filter,同样
所以你就可以把“分解成小列表的操作”放在几个核上运行
这样就可以充分利用多核的计算能力

大部分情况都如你所说,不过也有例外,比如前后依赖的lazy list:
fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)]

另外我觉得这是实现细节,聪明点的编译器也许能辨别能否把loop拆开来并行,比如考虑矩阵相乘操作。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics