我使用map编写了一个for循环,其函数具有副作用。这是我的意思的最小工作示例:
def someFunc(t):
n, d = t
d[n] = str(n)
def main():
d = {}
map(somefunc, ((i,d) for i in range(10**3)))
print(len(d))
很明显,映射到1000以下的非负数的someFunc
具有填充字典的副作用,后来用于其他字典。
现在,考虑到构造上述代码的方式,print(len(d))
的预期输出为0
,因为map
返回迭代器,而不是列表(与python2不同)。 X)。因此,如果我真的想看到应用于d
的更改,那么我将不得不迭代该地图对象直到完成。我能做到的一种方法是:
d = {}
for i in map(somefunc, ((i,d) for i in range(10**3))):
pass
但这似乎并不优雅。我可以在地图对象上调用list
,但这需要O(n)内存,这是低效的。有没有办法强制对地图对象进行完整的迭代?
答案 0 :(得分:1)
您不想这样做(仅针对副作用运行map()
),但此处适用itertools
consume
recipe:
from collections import deque
deque(map(somefunc, ((i,d) for i in range(10**3))), maxlen=0)
配置为最大大小为0的collections.deque()
object使用map()
iterable而不使用额外的内存。对于此用例,deque
对象为specifically optimized。