Python:如何更好地编写以下代码?

Python:如何更好地编写以下代码?,python,optimization,Python,Optimization,我对python非常陌生,因此没有完全意识到它的威力。我有下面一段代码,我认为它应该运行得更快。我有一种感觉,它可以使用numpy/map完成,但不确定如何构建它 这里讨论的两个词典都有10000个键,其值由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]]} 为此,我当前的代码(如下

我对python非常陌生,因此没有完全意识到它的威力。我有下面一段代码,我认为它应该运行得更快。我有一种感觉,它可以使用numpy/map完成,但不确定如何构建它

这里讨论的两个词典都有10000个键,其值由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\u com
的结构与上面定义的
T\u com
完全相似):

关于如何减少运行时间/避免循环有何建议?一般来说,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}

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

如果您需要检查字典中的每个元素来计算分数,那么您唯一的其他选择就是使用包含一些计算的辅助资源,这将避免您在每个字段中重复

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

很抱歉,我会留下这个作为一个评论,但我不允许评论,或者可能不知道如何

不管怎样,祝你好运

score=compute\u score(T\u com[tar\u node]tar\u社区,R\u com[ref\u node]ref\u社区)
score = compute_score(T_com[tar_node]tar_community,R_com[ref_node]ref_community)

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

,即使每个CopyTeCyPrimes的执行只需要1ms,如果你在Tycom中有10K元素,在Rycom中有10K元素,这将占用10K*10K*1ms,大约27个小时。按照你提出的方式,这是一个O(n2)问题。你能简化你的逻辑吗?如果不能,则需要其他技术—例如并行或分布式执行

==编辑==

正如您在评论中所解释的,这是一个dot产品。你能试着把它减少到O(n)吗?比如:

scores = []
for index in T_com.keys():
    score = T_com[index] * R_com[index]
dot_product = sum(scores)

可能属于on?您正在循环100000000次-当然很慢。
compute\u score
do做什么?compute\u score是一个非常简单的函数,只需计算两个向量的点积,首先将它们转换为numpy array()。@R.Bahl,在运行循环之前将它们转换为numpy array。@DSM,但是当只需要2*10^4时,就有2*10^8列表->数组转换。转换可能比dot-product考虑使用C所花的时间要长,但目前我正在寻找一种pythonic的优化方法。pinkdawn:你能提供一些关于如何可能将上述代码转换为Cython的线索吗?我在这个领域几乎没有经验。@R.Bahl检查教程这里:;cython将自动为您生成c代码,并调用gcc进行编译,如果您可以使用c,您还可以修改代码cython生成的代码实际计算速度比这快,大约需要10^-4,因此此代码大约需要3小时。您可以将逻辑想象为计算存储在两个字典中的一组向量的成对点积,然后将结果存储在磁盘上。但我觉得有一种更好的方法可以用python编写,可以使用numpy来索引或映射,但不确定如何使用。谢谢你的建议。我不确定这将如何工作,但让我考虑一下。
scores = []
for index in T_com.keys():
    score = T_com[index] * R_com[index]
dot_product = sum(scores)