【发布时间】:2017-04-19 03:36:34
【问题描述】:
我正在尝试在 python 中实现棕色聚类算法。
我有cluster = List[List]的数据结构
在任何时候,外部列表长度最大为 40 或 41。
但内部列表包含英文单词,例如“the”、“hello”等
所以我总共有 8000 个单词(词汇),最初前 40 个单词被放入集群。
我将词汇表从 41 迭代到 8000 # 做一些计算,这需要更少的时间。 # 合并列表中的 2 项并从列表中删除一项 # 例如:如果 c1 和 c2 是簇的项,那么
for i in range(41, 8000):
clusters.append(vocabulary[i])
c1 = computation 1
c2 = computation 2
clusters[c1] = clusters[c1] + clusters[c2]
del clusters[c2]
但是随着我对词汇表的迭代,行 clusters[c1] = clusters[c1] + clusters[c1] 所花费的时间逐渐增加。最初为 41-50 是 1 秒,但词汇中每 20 个项目的时间增加 1 秒。
在我的整个代码中仅注释 clusters[c1] = clusters[c1] + clusters[c1] 时,我观察到所有迭代都需要恒定的时间。我不确定如何加快这个过程。
for i in range(41, 8000):
clusters.append(vocabulary[i])
c1 = computation 1
c2 = computation 2
#clusters[c1] = clusters[c1] + clusters[c2]
del clusters[c2]
我是stackoverflow的新手,如果这里的格式不正确,请见谅。
谢谢
【问题讨论】:
-
请提供一段独立的代码,没有未提及的依赖项。
-
首先,您的意思是
clusters[c1] = clusters[c1] + clusters[c2]?其次,连接列表很慢。您可以将vocabulary元素的副本插入clusters而不是使用原始元素,然后使用+=而不是+来执行可变连接,而不是通过构建新列表。 -
是的,我的意思是 clusters[c1] = clusters[c1] + clusters[c2]。
-
clusters[c1] = clusters[c1] + clusters[c2] 或 cluster[c1] += cluster[c2] 也会产生任何性能差异。 c2 也可能是词汇表中单词的不同组合,因此我需要从 cluster[c2] 复制项目
-
我认为您可能需要考虑使用“不相交集”数据结构,而不是列表列表来描述您的语料库。它将为联合 和 集合成员操作提供近乎恒定的时间(实际上是逆阿克曼)。今天晚些时候我会写一个更详细的回复。
标签: python python-2.7 python-3.x