Python 提高用于循环的代码的性能

Python 提高用于循环的代码的性能,python,performance,Python,Performance,我试图根据一些数据创建一个列表,但在大数据上运行时,我使用的代码非常慢。因此,我怀疑我没有将所有Python功能用于此任务。在Python中是否有一种更高效、更快的方法 下面是对代码的解释: 您可以将此问题视为一个游戏列表(列表类型),每个游戏都有一个参与团队列表和游戏中每个团队的得分列表(列表xx)。对于当前游戏中的每一对,它首先计算与以前比赛的得分差异之和(赢得比赛,过去的DIF);仅包括当前游戏中的配对。然后,它用当前游戏中的分数差异更新每一对。使用defaultdict跟踪每场比赛中每对

我试图根据一些数据创建一个列表,但在大数据上运行时,我使用的代码非常慢。因此,我怀疑我没有将所有Python功能用于此任务。在Python中是否有一种更高效、更快的方法

下面是对代码的解释:

您可以将此问题视为一个游戏列表(列表类型),每个游戏都有一个参与团队列表和游戏中每个团队的得分列表(列表xx)。对于当前游戏中的每一对,它首先计算与以前比赛的得分差异之和(赢得比赛,过去的DIF);仅包括当前游戏中的配对。然后,它用当前游戏中的分数差异更新每一对。使用defaultdict跟踪每场比赛中每对球员的得分,并在每场比赛进行时更新该得分

在下面的示例中,基于一些数据,有for循环用于创建新变量
list_zz

数据和for循环代码:

将熊猫作为pd导入
将numpy作为np导入
从集合导入defaultdict
从itertools导入置换
列表类型=['A','B'],['B'],['A','B','C','D','E'],['B'],['A','B','C'],['A','B'],['C','A','B'],['A'],['B','C']]
列表_xx=[[1.0,5.0]、[3.0]、[2.0,7.0,3.0,1.0,6.0]、[3.0]、[5.0,2.0,3.0]、[1.0]、[9.0,3.0]、[2.0,7.0]、[3.0,6.0,8.0]、[2.0]、[7.0,9.0]]
列表_zz=[]
#for循环
wd=默认DICT(浮动)
对于zip中的i,x(列表类型,列表xx):
#工作人员1
如果len(i)==1:
#打印('NaN')
列表zz.append(np.nan)
持续
#当前游戏的配对和差异生成器(i)
成对=列表(排列(i,2))
dgen=(值[0]-置换(x,2)中的值的值[1]
#与前几场比赛的差异之和,包括当前比赛中的两支球队
对于团队,结果为zip(i,x):
win_comp_pass_difs=sum(如果键[0]==team,则成对键的wd[key]
#打印(赢的公司过去的DIF)
列表附加(赢得公司过去的DIF)
#更新当前游戏的配对差异
对于成对,拉链中的差异(成对,dgen):
wd[pair]+=diff
打印(列表)
看起来是这样的:

[0.0,
0.0,
楠,,
-4.0,
4.0,
0.0,
0.0,
0.0,
楠,,
-10.0,
13.0,
-3.0,
楠,,
3.0,
-3.0,
-6.0,
6.0,
-10.0,
-10.0,
20.0,
楠,,
14.0,
-14.0]

如果您能详细说明代码,使其更高效、执行更快,我将不胜感激。

在不检查代码总体设计的情况下,我突然想到一个改进:将代码移动到函数

正如目前所写的,您使用的所有变量都是全局变量。由于全局名称空间的动态特性,Python必须在每次使用和每次访问时查找您使用的每个全局变量。(1)在CPython中,这对应于哈希表查找,这可能非常昂贵,特别是在存在哈希冲突的情况下

相反,局部变量在编译时是已知的,因此存储在固定大小的数组中。因此,访问这些变量只需要取消对指针的引用,这相对来说要快得多

牢记这一原则,您应该能够通过将所有代码移到“main”函数中来提高性能(运行时间大约下降40%):

def main():
    ...
    # Your code here

if __name__ == '__main__':
    main()


(1)

我实际上已经照你说的做了,但仍然很慢。@MarioArend这样的优化只会给你一点优势。您的代码受到完全不同的因素的制约,我还没有花时间去寻找这些因素。