首页 > 解决方案 > 如果发生内存错误,如何解决在 Python 中获得 n 个二进制值的大量组合?

问题描述

我正在尝试运行获取 n 个二进制值 0 和 1 的所有组合。这是我输入的代码。

import itertools
from itertools import product
import pandas as pd
combinations=pd.DataFrame(product(range(2),repeat=k))

这在 k 的值较小时有效。但是,我需要获得至少30 个二进制值 0 和 1 的所有组合。例如,我尝试过k=31,它导致了如下所示的内存错误。

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-5-97fdebdd2a99> in <module>
----> 1 pd.DataFrame(product(range(2),repeat=k))

~\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
    467         elif isinstance(data, abc.Iterable) and not isinstance(data, (str, bytes)):
    468             if not isinstance(data, (abc.Sequence, ExtensionArray)):
--> 469                 data = list(data)
    470             if len(data) > 0:
    471                 if is_list_like(data[0]) and getattr(data[0], "ndim", 1) == 1:

MemoryError: 

我试图在具有 128GB RAM 和 python x64 版本的计算机上运行这段代码,但我没有成功获得所需的结果,但只有内存错误。

例如,是否可以创建两个或多个数据框,共同构成我想要的数据框?尽管如此,我不知道如何解决这个问题以进行单独的计算以获取组合并在最后组合它们。

或者,有没有其他方法可以在 python 中成功获得大组合?

我真的可以使用你的帮助。

标签: pythonpandasmemorycombinationsitertools

解决方案


您可以使用生成器生成所有 N 位的二进制字符串(这似乎是您想要的)

def generate_binary_strings(n):
    format_string = f"{{:0{n}b}}"
    for x in range(1 << n):
        yield format_string.format(x)


for x in generate_binary_strings(4):
    print(x)

这输出

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

不过,我仍然建议不要将它们放在列表中-这会很长bits=30:)


推荐阅读