python - 使用重复获取单词的所有组合 - python itertools.product 太慢

标签 python numpy python-itertools

我有一个数组值,我需要它来获取所有可能的组合。使用 itertools.product 可以轻松做到这一点。

例如。苹果可以是 elppa、appel、lppae 等。

但是,有两个警告。

我需要得到这个单词与字母重复30次的所有组合。 例如。啊啊啊aaaaaaaaaaaaaaaaaaaa苹果 ,苹果aaaaaaaaaaaaaaaaaaaaa苹果

显然,我们正在使用一个巨大的数据源,因此当我运行例如 6-10 次重复的测试时,速度相当快(即不到一分钟)。当过夜运行测试的 30 次方时,表明测试需要几天时间才能完成。

我使用过 Numpy,StackOverflow 上通常建议将其作为更快/更轻的使用方法。但我在这方面遇到了困难,因为我发现的所有变体都导致脚本杀死我的机器并使用磁盘空间,与缓慢(对于此测试来说太慢)但更高效的itertools.product

此外,我不明白如何将所有这些数据提取到 numty 数组中,然后计算以下内容,而不增加系统开销。

最终。

练习的重点是计算单词 apple 在每行结果中出现的次数。但仅当它连续出现一次时。 这算:aaaaaaaaaaaaaaaaaaaaaaaaaapple 这不会:苹果aaaaaaaaaaaaaaaaaaaa苹果

下面的代码工作时不会对机器造成太大压力,但运行速度太慢。

谢谢

import itertools
import time
import numpy as np

apple = ['a','p','l','e']
occurences = 0
line = 0
arr_len = len(apple)
length = 30
squared = arr_len**length

start_time = time.time()

for string in itertools.imap(''.join, itertools.product(apple, repeat=length)):
    line += 1
    if (string.count('apple')==1):
        occurences += 1
        if occurences % 100000 == 0:
            print occurences, ("--- %s seconds ---" % (time.time() - start_time)),squared, line

print ('Occurences : ',occurences)
print ('Last line no. ',line)  
print ("--- %s seconds ---" % (time.time() - start_time))

最佳答案

你尝试解决问题的方式本质上是指数级的。您需要使用动态规划。该问题有多项式时间解。如果您的单词中有 n 个字符,则可以使用具有 2n 个状态的马尔可夫链。

import numpy as np

word = 'papal'
length = 10

word_chars = list(set(word))
n = len(word)
m = len(word_chars)
states = [0] * (2*n)
states[0] = 1
jumps = np.zeros((n, m), dtype=np.int)
for i in range(n):
    for j in range(m):
        # We've seen the first i characters of word, and we see character word_chars[j]
        if word[i] == word_chars[j]:
            value = i+1
        else:
            for k in range(i+1):
                if word[k: i] + word_chars[j] == word[:i - k + 1]:
                    value = i - k + 1
                    break
            else:
                value = 0
        jumps[i, j] = value

for i in range(length):
   new_states = [0] * (2*n)
    for j in range(n):
        for jump in jumps[j]:
            new_states[jump] += states[j]
            if n+jump < 2*n:
                new_states[n+jump] += states[n+j]
    states = new_states

print(np.sum(states[n:]))

如果单词是“papa”,那么“papapa”是否匹配?如果不是,您应该删除马尔可夫链中的状态。

关于python - 使用重复获取单词的所有组合 - python itertools.product 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34183604/

相关文章:

python - 处理器 ID Python 3

python - 如何设置Paypal与python连接

python - 使用 Selenium Webdriver 向下滚动页面

python - 必须有更好的方法来获取这个字典列表的平均值和中位数

Python Selenium : Element currently not visible

python - 二维插值,一次一维

python - 通过分组对 NA 进行高性能填充

Python,numpy 排序数组

python - 在 python 中使 itertools.combinations 计算多进程?

Python通过islice循环读取20条记录