我对Python非常陌生,因此没有完全意识到它的强大功能。我有下面这段代码,我认为它应该更快。我有一个感觉,它可以使用numpy/map完成,但不知道如何构建它。Python:如何更好地编写下面这段代码?
无论所讨论的字典这里有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]]}
对于这一点,我的当前代码(下面讨论)被拉伸成小时,我有一种感觉不好。基本上,我正在阅读与字典中每个键相关的列表,计算它们的分数,然后将分数附加到字典中,最后写入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
如何减少运行时间任何建议/避免环路?在genereal中,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}
可能属于[codereview](http://codereview.stackexchange.com/)? – inspectorG4dget
您正在循环100,000,000次 - 当然这很慢。 'compute_score'是做什么的? –
compute_score是一个非常简单的函数,只需计算两个向量的点积,首先将它们转换为numpy array()。 –