python itertools卡死_Python:itertools.product消耗太多资源

这是你想要的吗?在

我在make方法中做了所有更改:def make(self, size):

with open('res.txt', 'w+') as file_: # file is a builtin function in python 2

# also, use with statements for files used on only a small block, it handles file closure even if an error is raised.

for i in range(1, size+1):

prod = itertools.product(self.chars, repeat=i)

for j, r in enumerate(prod):

text = ''.join(r)

md5 = self.getMD5(text)

res = text+'\t'+md5

print(res + ' %.3f%%' % ((j+1)/float(self.get_length(size))*100))

file_.write(res+'\n')

需要注意的是,这仍然会消耗千兆字节的内存,但不会消耗虚拟内存。在

编辑:正如Padraic所指出的,python3中没有file关键字,而且由于它是一个“坏的内置”,因此重写它并不太令人担心。不过,我还是把它命名为file。在

编辑2:

为了解释为什么这个方法比以前的原始版本更快更好地工作,您需要知道懒惰评估是如何工作的。在

假设我们有一个简单的表达式,如下所示(对于Python 3)(对于python2,使用xrange):

^{pr2}$

这会立即计算1万亿个元素到内存中,溢出内存。在

所以我们可以用发电机来解决这个问题:a = (i for i in range(1e12))

在这里,没有计算任何值,只是给出了解释程序如何计算它的说明。然后,我们可以逐个迭代每个项目并分别处理每个项目,因此在给定时间内存中几乎没有任何内容(一次只有1个整数)。这使得看似不可能完成的任务变得非常容易管理。在

与itertools相比,itertools允许你使用itertools来快速执行操作。在

在您的示例中,您有62个字符,并且希望使用5次重复(即62**5)的笛卡尔乘积(将近10亿个元素,或超过30 GB的ram)。这太大了。”

为了解决这个问题,我们可以使用迭代器。在chars = '01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ'

for i in itertools.product(chars, repeat=5):

print(i)

在这里,在给定的时间内,只有笛卡尔积中的一个项在内存中,这意味着它非常节省内存。在

但是,如果使用list()计算完整迭代器,那么它会耗尽迭代器并将其添加到一个列表中,这意味着将近10亿个组合突然又出现在内存中。我们不需要一次内存中的所有元素:只要1个。这就是迭代器的力量。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值