在生物信息学中,我们做了以下转变:
>>> data = {
(90,100):1,
(91,101):1,
(92,102):2,
(93,103):1,
(94,104):1
}
>>> someFuction(data)
{
90:1,
91:2,
92:4,
93:5,
94:6,
95:6,
96:6,
97:6,
98:6,
99:6,
100:6,
101:5,
102:4,
103:2,
104:1
}
数据中的元组始终是唯一对。 但是有很多方法可以进行这种转换 - 有些方法明显优于其他方法。我试过的是:
newData = {}
for pos, values in data.iteritems():
A,B = pos
for i in xrange(A,B+1):
try: newData[i] += values
except KeyError: newData[i] = values
这有利于它的短而甜,但我不确定它是那么高效.... 我有一种感觉,不知何故将dict转换为列表列表,然后做xrange,将节省大量的时间。我们每个实验都在谈论数周的计算工作。像这样:
>>> someFuction(data)
[
[90,90,1],
[91,91,2],
[92,92,4],
[93,93,5],
[94,100,6],
[101,101,5],
[102,102,4],
[103,103,2],
[104,104,1]
]
然后执行for / xrange循环。 #Python上的人们已经推荐了bisect和heapy,但是在与bisect一整天挣扎之后,我无法想出一个很好的算法,我可以100%一直工作。如果这里的任何人都可以帮助甚至指出我正确的方向,那么我将非常感激:)
答案 0 :(得分:0)
不确定为什么这只得到20次观看和投票。也许它对于SO而言过于特定领域?
无论如何,我昨晚制定了一个解决方案,将一个文件的总运行时间从大约400分钟缩短到251分钟。我会发布代码,但它很长,很可能在边缘情况下有bug。出于这个原因,我会说'工作'代码可以在程序> rawSeQL'中找到,但最有帮助的算法改进是:
在重叠数组上循环并将它们展平为具有乘数值的非重叠数组会产生巨大差异,因为xrange()现在不需要重复。
使用collections.defaultdict(int)对上面的try / except循环有很大的不同。 collections.Counter()和orderedDict比try / except慢很多。
我选择使用bisect_left()来找到插入下一个非重叠片段的位置,但它是马马虎虎,但随后添加了Bisect' low'限制其需要检查的列表范围的参数使计算时间大幅减少。如果对输入列表进行排序,则low的值始终是bisect的最后返回值,这使得此过程变得简单:)
有可能heapy会提供更多的好处 - 但是现在上面提到的主要算法改进可能会超过任何编译时的技巧。我现在有75个文件需要处理,这意味着这三件事可以节省大约12500天的计算时间:)