python惰性函数 python惰性计算( 二 )


56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
当参数里面的值足够大时,range()产生了一个巨大的列表,这是内存会吃不消,等待一段时间后程序会直接被Kill掉:
for i in range(999999999999):
...
print i
...
Killed:
9
占满内存
用xrange() 方法就不回出现这种问题,并且可以一直运行:
for i in xrange(999999999999):
...
print i
...
1
2
3
4
5
6
7
8
9
10...
在Python3中range已经被改为了xrange,所以在python3中可以放心使用range().
惰性求值不要求你事先准备好整个迭代过程中所有的元素 。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁
还有前文所说的list comprehension语句,在两边放上[] , 会产生别表,如果数据源很长则会报内存错误:
print [i for i in range(9999999999999999)]
Python(1627,0x7fffe5b713c0)
malloc: *** mach_vm_map(size=80000000000000000) failed
(error code=3)
*** error:
can't allocate region
*** set a
breakpoint in malloc_error_break to debug
Traceback
(most recent call last):
File "",
line 1, in /spanmodule
MemoryError
【python惰性函数 python惰性计算】这样直接产生列表没有效率 , 为了创建生成器对象,可以在list
comprehension两边放上() , 这样它就有了惰性求值的特性 。
print((i for i
in range(99999999999999)))
使用next()内建函数访问生成器里的元素:
num =
(i for i in range(5))
num
next(num)
next(num)
1
for j in range(4):
...
print(next(num))
...
2
3
4
Traceback
(most recent call last):
File "",
line 2, in /spanmodule
StopIteration
当访问到最后元素时,再调用next(),Python将会抛出StopIteration异常 。Python正是根据是否检查到这个异常来决定是否停止迭代 。
step1 =
someLongOperation1()step2 = someLongOperation2()step3 =
concatenate(step1, step2)
以上代码需要分别执行一二两步操作,第三步用到一二两步的结果,在Pyhton中会有序的执行这些函数:首先是 someLongOperation1,然后 someLongOperation2,最后 concatenate,如果确保没有函数修改或依赖于全局变量,第一二步可以被并行执行 。假设我们不想并行运行这两个函数 , 我们只在其他函数依赖于 step1 和 step2 时才需要执行这两个函数 。我们甚至在concatenate 调用之前都不必执行他们,可以把他们的求值延迟到 concatenate 函数内实际用到他们的位置 。如果函数中用到了if分支语句,条件无关step1和step2则可以尽量将判断条件放前面以减少不必要的计算:
step1 =
someLongOperation1()
step2 =
someLongOperation2()if condition:
step3 =
concatenate(step1, step2)
换为:if condition:
step1 =
someLongOperation1()
step2 =
someLongOperation2()
step3 =
concatenate(step1, step2)
如果 concatenate 是一个带有条件分支的函数并且有的分支中只用了两个参数中的一个,另一个参数就永远没有必要被求值 。
python惰性函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python惰性计算、python惰性函数的信息别忘了在本站进行查找喔 。

推荐阅读