2016-09-28 80 views
0
def numbers(mi, ma): 
    return [n for n in range(mi, ma + 1)] 

def gen(xs): 
    return (x for x in xs) 

example = gen(numbers(10, 20)) 

在这个例子中,gen可以提高numbers的迭代性能吗?为什么不)?生成列表可以提高Python的性能吗?

def numbersGen(mi, ma): 
    return gen([n for n in range(mi, ma + 1)]) # Generator from list comprehension? 

Python能像Haskell一样懒惰吗?

+1

Python不能像'Haskell'一样懒,因为它的运行原理是不同的。在显示的代码中,该列表是在*从数字返回之前创建的*它是用生成器包装的返回列表。这同样适用于“直接”形式。如果生成器在迭代过程中比迭代更快,我会非常怀疑。 – user2864740

+0

我了解Python的基本操作顺序;我想知道是否有优化好处或句法特殊。 – suchtgott

+0

很少有Python可以做/优化这种情况 - 每一个表达式都被急切地评估为一个值,因为它被“执行”了,然后它才能够提供下一个值。这与大多数常用语言(从JavaScript到C#)类似,与Haskell完全不同,它是一种纯粹的函数式语言。 Python程序必须重新选择懒惰,比如在没有预先实现源的情况下使用生成器。 – user2864740

回答

0

在这种特殊情况下,range已经像您希望的那样懒惰了。没有理由进一步将其输出封装在间接层中。当然,Python生成器与Haskell懒惰的常见警告也适用;即多次迭代,或从多个特定点继续,这在Python中是很痛苦的,但是结果是内存使用通常更容易预测。

+1

在Python 3中,'range'就是'xrange'。 – suchtgott

+0

@mentalCase相关知识!我已更新我的答案,谢谢。 –