python - 在python中生成大量序列时如何优化存储大小和性能?

标签 python algorithm performance optimization storage

问题

对于给定的整数 n,我正在生成这种形式的所有可能序列:

  • 序列长度为n
  • 序列必须包含数字 n , n-1 , n-2 , ... , n-k ≥ 1对于一些 k < n .数字可以重复。

例如,对于 n = 3 ,可能的顺序是:

1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
2, 2, 3
2, 3, 2
3, 2, 2
2, 3, 3
3, 2, 3
3, 3, 2
3, 3, 3

换句话说,序列必须包含n和从 n 开始倒计时的数字没有任何跳跃,但没有特定的顺序并且允许重复。

给定n ,此类序列的数量由 ordered Bell numbers 给出或富比尼数,其增长速度极快。

这是我用来生成序列的代码:

from sympy.utilities.iterables import multiset_permutations

def generate_sequences(n):
    sequences = []
    for unpermuted_seq in unpermuted_sequences(n,n):
        for permutation in multiset_permutations(unpermuted_seq):
            sequences.append(permutation)
    return sequences

def unpermuted_sequences(number,remaining_slots):
# Generates list of possible unpermuted sequences 
    if remaining_slots == 0:
        yield []
        return
    for repetitions in range(1, remaining_slots + 1):
        for sequence in unpermuted_sequences(number - 1, remaining_slots - repetitions):
            yield sequence + repetitions*[number]

问题

上面发布的代码按预期工作。我的两个主要问题如下:

  1. 存储:对于我的特定应用程序,一次 n被选中,我需要存储所有的序列。我最终需要遍历列表并删除不满足特定条件的序列。然而,即使是小的 n (即 n > 8 ),需要大量内存(GB 数量级)。

  2. 生成时间:我的代码需要很长时间才能生成序列,即使对于小的 n 也是如此。 .

如何以优化存储和生成时间的方式生成序列?

最佳答案

我当然会将这些值存储为二进制。对于最多 16 个数字,您甚至可以使用半字节(4 位 - 使用一些位移)来存储每个值。因此,对于 n=8,您“仅”需要 545835 * 4 字节 = ± 2MB——对于 n=10 ± 500MB。

为了更快地处理和写入文件,您可以使用 memory mapping (预先计算所需的大小,创建该大小的文件,然后使用内存映射打开它)。

这样每个值都可以直接写入映射(即文件,就好像它是内存),这也将消除较慢的 sequences.append(permutation)。还要考虑只编写您需要的序列,因为如果您以后想删除它们,您将需要移动所有其他数据。

您还可以在文件中添加一个小 header ,其中包含一些值:nknumber of sequences,二进制。

关于python - 在python中生成大量序列时如何优化存储大小和性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208240/

相关文章:

c++ - 如何高效统计定义指针的个数?

algorithm - Haskell 性能优化

python - 在列表(表)的列表中打印字符串

.net - Python 确定一年中的第几周(非 ISO 方式)

python - 具有装饰功能的多处理池给了我 "object has no attribute"

c++ - 为什么在 C++23 中分配_at_least()?

c++ - 我应该认为静态拷贝是成本高昂的吗?

python - 如何搜索子字符串,找到开始和结束,然后检查该数据是否为工作日?

c++ - 如何统计long long类型变量的位数?

performance - Normalize.css 应该作为单独的文件保存还是编译(通过 postcss @import)到最终的 "styles.css"文件中?