【问题标题】:I need faster methods to optimize my loop我需要更快的方法来优化我的循环
【发布时间】:2020-06-29 16:19:33
【问题描述】:

所以,我是一个 python 新手,正在寻找对如何优化我的代码有想法的人。我正在使用一个超过 6000 行的电子表格,而我的这部分代码似乎真的效率低下。

for x in range(0,len(df):
  if df.at[x,'Streak_currency'] != str(df.at[x,'Currency']):
      df.at[x, 'Martingale']  = df.at[x-1, 'Martingale'] + (df.at[x-1, 'Martingale'] )/64
      x+=1
      if df.at[x,'Streak_currency'] == str(df.at[x,'Currency']):
        x+=1

运行可能需要 8 分钟以上。 以我有限的知识,我只设法将我的 df.loc 更改为 df.at,它帮助很大。但是我觉得

更新

在这部分代码中,我试图根据先前的值应用一个函数,直到满足某个条件,在这种情况下, df.at[x,'Streak_currency'] != str(df.at[x,'Currency']):

我真的不知道为什么这个迭代需要这么长时间。理论上,它应该只查看以前的值并应用该函数。以下是输出示例:

Periodo Currency ... Agrupamento Martingale 0 1 GBPUSD 1 1.583720 <--- starts aplying a function over and over. 1 1 GBPUSD 1 1.608466 2 1 GBPUSD 1 1.633598 3 1 GBPUSD 1 1.659123 4 1 GBPUSD 1 1.685047 5 1 GBPUSD 1 1.711376 <- stops aplying, since Currency changed 6 1 EURCHF 2 1.256550 7 1 USDCAD 3 1.008720 <- starts applying again until currency changes 8 1 USDCAD 3 1.024481 9 1 USDCAD 3 1.040489 10 1 GBPAUD 4 1.603080

【问题讨论】:

  • 我认为循环内代码中的 x+=1 没有任何用处,尤其是在货币条件下,因为 x 每次迭代都会获得新值,从不在乎什么值你加了。你可以试试这个例子来理解我在说什么 ``` for i in range(0,10): ... print(i) ... i += 1 ```
  • 如果你能解释你试图从这个循环中实现的目标,那么任何人都可以为你的问题提供答案
  • 感谢@KareemEmad 的快速回复!我尝试更新帖子,以便您更好地了解我想要实现的目标

标签: python pandas loops optimization


【解决方案1】:

df.at[x,'Streak_currency'] 这样的 Pandas 查找效率不高。实际上,对于这种表达式的每次求值(每次循环迭代多次),pandas 都会获取有关其名称的列,然后获取列表中的值。 您可以通过在循环之前将列存储在变量中来避免这种计算成本。此外,您可以将列放在 numpy 数组中,以便以更有效的方式获取值(假设所有值都具有相同的类型)。 最后,对整数使用字符串转换和字符串比较效率不高。在这里可以避免它们(假设整数不是不合理的大)。

这是一个例子:

import numpy as np
streakCurrency = np.array(df['Streak_currency'], dtype=np.int64)
currency = np.array(df['Currency'], dtype=np.int64)
martingale = np.array(df['Martingale'], dtype=np.float64)
for x in range(len(df)):
    if streakCurrency[x] != currency[x]:
        martingale[x] = martingale[x-1] * (65./64.)
        x+=1
        if streakCurrency[x] == currency[x]:
            x+=1
# Update the pandas dataframe
df['Martingale'] = martingale

这应该至少快一个数量级。

请注意,第二个条件是无用的,因为比较的值不能同时相等和不同(这可能是您的代码中的错误)...

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-01-14
    • 2021-04-06
    • 2011-05-27
    • 2021-10-04
    相关资源
    最近更新 更多