我对 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}