python - 有什么比 itertools 更快的替代品?

标签 python numpy combinations python-itertools


k = 7
n = 30

def f(k,n):
    p = []
    for i in range(n):
        p.append(len(list(itertools.combinations([x for x in range(2**k)],i)))

上面的代码运行缓慢并且对于较大的变量值会出现错误而中断的问题。我尝试过 sklearn.cartesian,但在需要组合时得到了排列结果。我知道有一种方法可以让它用 numpy 更快地工作,但我还没有弄清楚如何实现它。 Similar question有关于 numpy 的答案,但我不明白 np.column_stack((np.repeat(a, b.size),np.tile(b, a.size))) 应该如何工作就我而言。正如我现在所看到的,我将是数组的许多维度,并且会发生变化,我不完全理解如何处理这个事实。

最佳答案

使用 number of combinations 的公式,您可以像这样迭代地执行此计算:

def f(k, n):
    p = [1]
    f = 1 << k
    for i in range(1, n):
        p.append((p[-1] * f) // i)
        f -= 1
    return p

# For comparison
def f_orig(k, n):
    import itertools
    p = []
    for i in range(n):
        p.append(len(list(itertools.combinations([x for x in range(2 ** k)],i))))
    return p

# Test
k = 4
n = 5
print(f(k, n))
# [1, 16, 120, 560, 1820]
print(f_orig(k, n))
# [1, 16, 120, 560, 1820]

一个小基准:

k = 5
n = 8
%timeit f(k, n)
# 1.55 µs ± 498 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit f_orig(k, n)
# 528 ms ± 1.15 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

随着数量的增加,差异会变得更大,而且这不需要任何额外的内存。

关于python - 有什么比 itertools 更快的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60071273/

相关文章:

简单的 Python 索引

java - 如何使这种组合/排列方法递归?

java - 来自 Java 客户端的 Python 套接字接收

python - 在 Python3 的 Matplotlib 的极坐标/径向条形图中获取条形图顶部的标签

python - 使用 scikit learn 获取信息量最大的特征时遇到问题?

python - 你能通用地编写 numpy 切片吗?

python - Twitter 身份验证问题

python - 从索引数组的函数返回等价于 `:`

java - 了解使用数组中所有可能组合的递归

python - 在 python 中进行组合