1

我对 python 很陌生,因此没有完全意识到它的力量。我有以下代码,我认为应该可以更快地工作。我有一种感觉,它可以使用 numpy/map 来完成,但不知道如何构建它。

这里有问题的两个字典都有 10,000 个键,其值由 7 个元素的列表组成,例如:

T_com ={0: [[1.2, 3,.65,.63, 3, 3 , 5.5]] 1:[[1.7, 2,.55,.13, 2, 8 , 5.5]] ...10,000th key:[[3.2, 9,.15,.23, 1, 3 , 2.5]]}

为此,我当前的代码(下面讨论)延伸到hours,我觉得这不好。基本上,我正在阅读与两个字典中的每个键相关的列表,计算它们的分数,然后将分数附加到字典中,最后将其写入 ZODB。以下是片段(字典的结构与上面定义R_com的完全相似。):T_com

 for tar_node,tar_community in T_com.iteritems():   # iterate over the key value pair of first dic
     for i,(ref_node,ref_community) in enumerate(R_com.iteritems()):  # iterate over second dictionary. Enumeration was required for some other operation
         score = compute_score(T_com[tar_node],R_com[ref_node])      # calculate some score   
         bTree_container.setdefault(tar_node,PersistentList () ).append( [ref_node,score,priority.pop(),0])    #Builds a list of lists associated with every value of tar_node
         if i % 2500 ==0:            # After every 2,500 values temporarily save the data to disk
             transaction.savepoint(True)
 transaction.commit()  # finally write all the data to disk 

关于如何减少运行时间/避免循环的任何建议?一般来说,python处理这种情况的最佳实践是什么?

正如所建议的,来自 cProfile 的一些结果:-

200000000 3792.449    0.000 3792.449    0.000 {numpy.core.multiarray.array}
100000000   51.033    0.000   51.186    0.000 {method 'setdefault' of 'BTrees.IOBTree.IOBTree' objects}
4

3 回答 3

0

从外观上看,您正在为您遍历的每个字典中的每个元素创建一棵树和一个新节点。

如果您需要检查字典的每个元素来计算分数,您唯一的另一个选择是拥有一个包含一些计算的辅助资源,这将防止您不得不通过每个字段重复。

同样,您可以保留每个字典生成树的副本,然后在获得更多信息时简单地添加到每个字典中,并最终将它们链接在一起。

抱歉,我会将其作为评论留下,但我不允许发表评论,或者可能无法弄清楚如何......

无论如何,祝你好运!

于 2012-07-04T03:05:50.953 回答
0
score = compute_score(T_com[tar_node]tar_community,R_com[ref_node]ref_community)

这可以为您节省一些 dict 查找时间,但您的根本问题是 x*y; 如果您真的需要这个,并且非常关心运行时间,请考虑使用 cython 或纯 c 代码来加速

于 2012-07-04T03:10:19.793 回答
0

即使每次执行 compute_score 只需要 1ms,如果 T_com 中有 10k 个元素,R_com 中有 10k 个元素,这将花费你 10k * 10k * 1ms,大约 27 小时。你提出的方式,这是一个 O(n2) 问题。你能简化你的逻辑吗?如果不能,则需要其他技术——例如并行或分布式执行。

==编辑==

正如您在评论中解释的那样,这是一个点积。你能试着把它减少到 O(n) 吗?就像是:

scores = []
for index in T_com.keys():
    score = T_com[index] * R_com[index]
dot_product = sum(scores)
于 2012-07-04T03:15:23.450 回答