我有一个范围列表。我现在想计算一个字典key:value,其中key是数字,value是数字存在的范围
一个不好的计算方法是:
from collections import defaultdict
my_dict = defaultdict(int)
ranges = [range(-4200,4200), range(-420,420), range(-42,42), range(8,9), range(9,9), range(9,10)]
for singleRange in ranges:
for number in singleRange:
my_dict[number] += 1
sort_dict = sorted(my_dict.items(), key=lambda x: x[1], reverse=True)
print(sort_dict)
您将如何更有效地执行此操作
也许可以做一些更有效的事情,但是这个解决方案的优点是严重依赖于
numpy
的速度。对于10k范围,这在我的笔记本电脑上运行约600毫秒改进了我之前的答案,该算法解决了
O(n + m)
中的问题,其中n
是总范围的长度m
是子范围的数量基本思想是只遍历
n
个数一次,保留当前数所属范围数的计数器。在每一步中,我们检查是否通过了范围起始,在这种情况下,计数器将递增。相反,如果我们已经通过了一个范围停止,计数器就会递减下面的实际实现将
numpy
和pandas
用于所有繁重的工作,因此该算法的迭代性质似乎不清楚,但它基本上只是我所描述的向量化版本与我之前回答的600毫秒相比,我的笔记本电脑上10k范围的时间减少到了20毫秒。此外,这里的内存使用率也是
O(n + m)
,而它在那里O(nm)
,因此更大的n
和m
成为可能。您可能应该使用此解决方案,而不是第一个版本相关问题 更多 >
编程相关推荐