私はPythonにまったく慣れていないため、その力を完全には認識していません。より速く動作すると思われる次のコードがあります。numpy/map を使用して実行できると思いますが、それを構築する方法がわかりません。
ここで問題となっている両方の辞書には、次のような 7 つの要素のリストによって形成される値を持つ 10,000 個のキーがあります。
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]]}
このため、私の現在のコード (以下で説明) は何時間にもわたって伸びていますが、これは良くないと感じています。基本的に、両方の辞書の各キーに関連付けられたリストを読み取り、それらのスコアを計算してから、スコアを辞書に追加し、最後に 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}