我知道python中的生成器至少是memeory efficent,因为它一次只处理一个项目,但这如何使它具有时间效率(如果是的话)
具体来说,假设我使用generator函数为机器学习任务一次加载一个数据。在一天结束时,我仍然需要遍历所有数据元素,并一次加载一个(使用生成器函数)。是的,这是memeory Efficient,但是加载整个数据集要比一次加载所有数据集花费更多的时间。我的直觉正确吗
#sample_code
def my_gen():
for i in range(1000):
features = np.random.randn(32,32,3)
labels = np.random.randint(0,1, size = 1)
yield features, labels
不。生成器本质上比类似的备选方案(如列表理解)慢
但是
如果您希望通过使用生成器加载数据来减少内存,那么您可能不应该担心这种性能差异。更常见的情况是,性能瓶颈出现在磁盘I/O和/或系统调用上。使用生成器的惩罚对总体性能的影响可以忽略不计
所以最后的答案是:继续使用发电机。它的性能应该是最不需要担心的
生成器是您使用的功能。特定任务的实现是不同的,它是否可扩展是不同的情况。
您可以每次读取单个项目,也可以每次读取大量数据并在每次处理它们。 因此,根据您的情况,后者可能是一个更好的选择。在这种情况下,它也会更省时
将生成器视为一个惰性序列,它通常比相应的渴望序列的时间效率低
这是因为生成器保持中间状态,每个项都必须恢复中间状态。相反,急切地创建序列只需处理一次中间状态
但是请记住,发电机的开销基本上是固定的。如果每个项目都需要很长时间来计算,则生成器的恒定开销可以忽略不计。当一次处理一个项目时,s还允许释放已处理的项目,从而减少流程上的总体负载——可能在某个时候达到净时间优势
生成器的优点是,懒散性允许表示无限序列和延迟–与序列“普通O(ni)”相比,生成器是“n倍O(i)”。这允许生成器以可靠的时间效率生成每个项,即使整个过程会无限延迟
一个无限的,急切的序列将具有无限的时间复杂度,但一个无限的,懒惰的生成器只根据需要生成项
同样,生成器允许外部数据源提供每个项目之间的时间间隔。当数据源在提供项目之间有明显的延迟时,这可以使生成器更高效
相关问题 更多 >
编程相关推荐