惰性计算是一种编程策略,它使得程序在何时执行计算的决定推迟到需要结果时才进行。这种策略的好处在于,它允许程序处理大规模数据或者需要大量计算的任务时节省内存和计算资源。
举例来说,当我们调用 Python 中的 range()
函数时,我们可以传递一个非常大的参数给它,比如 range(100000000)
,但是这并不会立即在内存中创建包含这么多数字的列表。相反,range()
函数返回一个迭代器,这个迭代器知道如何在需要时生成这么多的数字,而不会提前生成并保存所有的数字。这样做的好处是,即使处理的数据量很大,也不会立即耗尽系统的内存。
在惰性计算中,计算机首先接受你的指令并将其存储,但不会立即执行这些指令。相反,它会等到需要结果时才会执行这些命令。这意味着,如果你不要求计算机给出最终结果,它就不会执行任何中间步骤。这种行为使得程序可以更加灵活地处理数据,并且能够延迟计算,直到真正需要结果时才进行。
总的来说,惰性计算提供了一种高效地处理大规模数据和复杂计算任务的方法,它通过推迟计算来节省内存和计算资源,并且只在需要结果时才执行计算,从而提高了程序的性能和效率。
一些你需要知道的惰性函数 Map,range,filter,zip,iglob
Filter:接受一个序列,并限制其元素必须满足指定的条件
Zip:接受两个序列并返回tuple序列
Iglob: 延迟对文件系统的查询
理解迭代器
迭代器是python中所有可以遍历的数据类型的基类有,迭代过程由一个__iter__()来定义,如果一个类有这个方法,并返回一个带有__next__()方法的对象,那么我们就可以对它进行迭代
生成器:用来创建数据的函数
不必在内存中花费空间来保存列表
生成器表达式:在一行代码中包含无线的数据
当涉及到惰性计算、迭代器和生成器时,Python 提供了一些非常强大的工具,可以帮助你更有效地处理大规模数据集或者在处理数据时节省内存。
惰性计算和惰性函数
1. Map
map()
函数接受一个函数和一个可迭代对象,并返回一个将该函数应用于可迭代对象中每个元素的迭代器。
result = map(func, iterable)
2. Filter
filter()
函数接受一个函数和一个可迭代对象,并返回一个仅包含满足指定条件的元素的迭代器。
result = filter(func, iterable)
3. Zip
zip()
函数接受两个或多个可迭代对象,并返回一个将每个可迭代对象中对应元素组合成元组的迭代器。
result = zip(iterable1, iterable2)
4. Iglob
iglob()
函数在文件系统中进行延迟查询,并返回一个生成文件名的迭代器。
import globresult = glob.iglob(pattern)
迭代器
迭代器是可以逐个访问元素的对象,它具有 __iter__()
方法,返回一个拥有 __next__()
方法的对象。
class MyIterator:def __init__(self, data):self.index = 0self.data = datadef __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return valuemy_iter = MyIterator([1, 2, 3])
for item in my_iter:print(item)
生成器
生成器是用来创建数据的函数,它可以节省内存并允许你按需生成数据。
1. 生成器函数
生成器函数使用 yield
语句来返回值,并在每次调用时暂停执行,保持局部状态。
def my_generator():yield 1yield 2yield 3gen = my_generator()
for value in gen:print(value)
2. 生成器表达式
生成器表达式是一种简洁的方式来创建生成器,类似于列表推导式,但使用圆括号而不是方括号。
gen = (x for x in range(10) if x % 2 == 0)
for value in gen:print(value)
这些工具在处理大规模数据或需要惰性计算时非常有用,可以帮助你更高效地处理数据,并在需要时节省内存。