Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中for循环的优化_Python_Loops_Pandas_For Loop_Optimization - Fatal编程技术网

python中for循环的优化

python中for循环的优化,python,loops,pandas,for-loop,optimization,Python,Loops,Pandas,For Loop,Optimization,我正在为不同的时间戳执行以下代码,每个时间戳将有近一百万条记录。一次约会花了一个多小时,我有总共35次约会的数据 有没有办法优化这段代码 def median(a, b, c,d,e): I=[a,b,c,d,e] I.sort() return I[2] for i in range(2, len(df['num'])-2): num_smooth= median(df['num'][i-1], df['num'][i-2], df['num'][i],

我正在为不同的时间戳执行以下代码,每个时间戳将有近一百万条记录。一次约会花了一个多小时,我有总共35次约会的数据

有没有办法优化这段代码

def median(a, b, c,d,e):
    I=[a,b,c,d,e]
    I.sort()
    return I[2]

for i in range(2, len(df['num'])-2):
    num_smooth= median(df['num'][i-1], df['num'][i-2], df['num'][i],
                       df['num'][i+1], df['num'][i+2])
    df.set_value(i,'num_smooth',num_smooth)
df['num_smooth'].fillna(df['num'], inplace=True)

...........................................
Remaining code
我猜您的df是一个数据帧对象。Pandas具有计算滚动统计数据的内置功能,包括滚动中值。此功能可通过熊猫系列和数据帧对象上的方法获得

有关使用滚动和相关功能的更多一般信息,请参阅上的熊猫文档。作为一般规则,当性能很重要时,您应该更喜欢使用内置的Pandas和NumPy函数和方法,而不是显式的Python级别的for循环,尽管一如既往,您应该确定您的解决方案。在我的机器上,使用包含一百万个随机浮点的df['num']系列时,基于滚动的解决方案大约需要129秒,而基于for循环的解决方案大约需要0.61秒,因此使用滚动将代码速度提高了200倍以上

所以在你的情况下

df['num_smooth'] = df['num'].rolling(window=5, center=True).median()
随着你已经拥有的fillna步骤,你应该会得到一些接近你需要的东西

请注意,Pandas 0.18中用于计算滚动统计信息的语法已更改,因此您至少需要0.18版本才能使用上述代码。对于Pandas的早期版本,请查看函数。

我猜您的df是Pandas数据帧对象。Pandas具有计算滚动统计数据的内置功能,包括滚动中值。此功能可通过熊猫系列和数据帧对象上的方法获得

有关使用滚动和相关功能的更多一般信息,请参阅上的熊猫文档。作为一般规则,当性能很重要时,您应该更喜欢使用内置的Pandas和NumPy函数和方法,而不是显式的Python级别的for循环,尽管一如既往,您应该确定您的解决方案。在我的机器上,使用包含一百万个随机浮点的df['num']系列时,基于滚动的解决方案大约需要129秒,而基于for循环的解决方案大约需要0.61秒,因此使用滚动将代码速度提高了200倍以上

所以在你的情况下

df['num_smooth'] = df['num'].rolling(window=5, center=True).median()
随着你已经拥有的fillna步骤,你应该会得到一些接近你需要的东西


请注意,Pandas 0.18中用于计算滚动统计信息的语法已更改,因此您至少需要0.18版本才能使用上述代码。对于Pandas的早期版本,请查看函数。

逐行评测python代码性能的好工具是。

逐行评测python代码性能的好工具是。

您尝试过评测代码吗?您发布的代码中没有任何内容需要花费1小时的时间,即使是100 mil+记录。代码中还有一些其他计算。在我加入这段代码之前很快,你试过分析你的代码吗?您发布的代码中没有任何内容需要花费1小时的时间,即使是100 mil+记录。代码中还有一些其他计算。我很快就把这段代码包括进去了是的,没错。我正要发这个。是的,没错。我正要发这个。