我试图在这里和Python文档中找到答案,但我得到的唯一问题是关于散列列表对象的问题以及详细说明dicts如何工作的细节。
我正在开发一个程序来解析一个巨大的图形(atm.44K节点,其中14K是有意义的,并且它们通过15K边连接)并且在性能方面存在问题,尽管我已经优化了我的算法我现在可以,现在最后的办法是优化数据结构:
def single_pass_build(nodes):
for node in nodes:
if node.__class__ in listOfRequiredClasses:
children = get_children(node)
for child in children:
if child__class__ in listOfRequiredClasses:
add_edge(node, child)
def get_children(node):
return [attr for attr in node.__dict__.values() if attr.__class__ in listOfRequiredClasses]
我仍然需要关心我的add_connection函数,但即使没有它,我的程序只需要超过10分钟,除了这个迭代。为了比较:我从中获取数据的模块在不超过5秒的时间内从xml文档生成数据。
我总共有44K对象,每个对象代表一个ralation图中的一个节点。我得到的对象有很多属性,所以我可以尝试优化get_children
以了解每个类的所有相关属性,或者只是加快查找速度。列表取O(n)(所以如果a是数字os属性,k是我列表中的类数,我得到一个总O(n a k + m a k))的。我的许多属性类都不在该列表中,所以我更接近最坏的情况而不是平均值。我想加快从O(k)到O(1)或至少O(log(k))的查找
知道dict的键查找对于许多哈希冲突应该是O(log(n))并且对于(很少)没有哈希冲突,它变得(几乎)是静态的。在我不关心任何值之后我想知道是否有一种针对x in list
优化的(哈希)列表?
我可以使用带有None值的dict但是将来总共有70000个查找和更多的图表,每毫秒计数。这里的空间不是大问题,因为我期望总共有50个班级,而且在任何情况下都不会超过几百个班级。在其他情况下,空间也可能是一个问题。
我不希望答案是标准的Python,但maby有人知道一个共同的框架可以帮助或可以让我相信没有理由为什么我不能使用dict来完成这项工作。< / p>
答案 0 :(得分:3)
您想要内置set
类型:https://docs.python.org/2/library/stdtypes.html#set
是的,它是标准Python中的IS;)