我正在使用一个超出内存限制的cpu绑定的应用程序,我正在尝试合并两个东西,无论它们是列表还是dicts。
现在问题是我可以选择任何一个,但我想知道合并dicts是否会更快,因为它全部都在内存中?或者它总是为O(n),n是较小列表的大小。
我询问dicts而不是sets的原因是因为我无法将一个集转换为json,因为这导致{key1,key2,key3}和json需要一个键/值对,所以我使用的是dict所以json dumps返回{key1:1,key2:1,key3:1}。是的,这是浪费,但如果它被证明更快,那么我没关系。
编辑:我的问题是使用dict和list进行合并的区别,我最初和错误地将dict和set设置为列出。
dict1 = {“the”:{“1”:1,“3”:1,“10”:1}
dict2 = {“the”:{“11”:1,“13”:1}}
合并后
dict3 = {“the”:{“1”:1,“3”:1,“10”:1,“11”:1,“13”:1}
答案 0 :(得分:2)
如果您正在寻找重复消除,则设置非常非常快。
>>> x = set(range(1000000,2000000))
>>> y = set(range(1900000,2900000))
the following happened in ~0.020s
>>> z = set.intersection(x,y)
>>> len(z)
100000
关于输出到json,只需转换为列表...
json_encode(list(z))
答案 1 :(得分:1)
您可以使用timeit模块来衡量代码的速度,但我猜测它们几乎是相同的(因为一个集合可能是使用字典实现的)。
答案 2 :(得分:1)
Dicts和sets会一样快(和你猜测的O(N)
一样)。列表,您只在Q的标题中提及而从未在其文本中提及,可能会更慢,这取决于您所说的“合并”。
考虑到json
下游要求,所有设置为1
的值的整体将是最快的 - 不是用于合并,而是用于JSON序列化。
答案 3 :(得分:0)
我更担心正确性。如果您有重复的键,列表将复制您的键和值。字典只保留其中一个值。此外,列表将保持订单一致。你更喜欢哪一个?
我的直觉反应是,如果你正在搜索键,字典会更快。但是你将如何处理重复?
答案 4 :(得分:0)
timeit
模块可能最容易,亲眼看看。这很容易做到:
import timeit
def test():
# do your thing here
# including conversion to json
pass
result = timeit.repeat(test, repeat=10, number=10000)
print '{0:.2}s per 10000 test runs.'.format(min(result))
希望有所帮助。