【问题标题】:How to remove a slow loop in Python and use Lambda or something else instead如何删除 Python 中的慢循环并改用 Lambda 或其他东西
【发布时间】:2019-02-08 16:16:13
【问题描述】:

用 lambda 或其他东西替换循环以提高运行速度

我有一个有效的循环,但对于我的真实数据集,它会太慢 我基本上有一个巨大的文本文件,每一行由 \n 字符分隔。

在每条唯一消息的开头都有一个独特的消息指纹,为此,假设它们以 # 开头。我已将这个 # (Y) 或不 (N) 的出现放在单独的列中,称为“开始”

我想查找不以 # 开头的行,如果下面的行也不以 # 开头,我想将两者连接起来。暂时忽略任何删除 \ns 的愿望,我已经解决了。

我的循环可以工作,但我怎样才能使用 lambda 函数或任何其他方式来获得良好的加速?

提前致谢

for i in range(2,(len(df)-1)):
    if ((df['Beginning'][i] == 'N') and (df['Beginning'][i+1] == 'N')):
        df['Message'][i] = df['Message'][i]  +  df['Message'][i+1]
        df['Message'][i+1] = ""

尝试编辑以添加示例:

消息开始时间 01:01:2018:12:15:28 \n

bla bla 短信\n

关于问题位置的详细信息\n

其他方面的细节\n

消息开始时间 01:01:2018:12:16:78 \n

bla bla 短信类型 2 something xxxxxx \n

消息开始时间 01:01:2018:12:21:05 \n

bla bla 短信类型 3 something xxxxxx \n

这件事的详细位置\n

那个东西的详细位置\n

我的价格详情\n

为您提供价格详情\n

很多\n

更多\n

无聊\n

文字\n

消息开始时间 01:01:2018:12:35:01 \n

bla bla 短信类型 2 something xxxxxx \n

所以上面是 4 条不同的消息,不同的长度,我想连接文本,所以每条消息有一行,其中包含从头到尾的所有信息

【问题讨论】:

  • 您能否澄清一下:我在您的代码中看到了df - 您使用pandas.DataFrame吗?
  • 我在可视化您的示例输入时也遇到了麻烦。你能举一些例子吗?
  • 是的,我正在使用 pandas,为提示喝彩
  • 没有理由 lambda 会比您当前的解决方案更快。为了加快处理速度,您需要更改数据格式、处理或两者兼而有之。

标签: python loops lambda


【解决方案1】:

我想你要找的是df.shift()

例如,您可以将迭代和 if 语句替换为以下内容:

df[(df['Beginning'] == df['Beginning'].shift(1)) & (df['Beginning'] == 'N')]

或者(我实际上会做什么)

mask = (df['Beginning'] == df['Beginning'].shift(1)) & (df['Beginning'] == 'N')

df.loc[mask, 'Message'] = df.loc[mask, 'Message'] + df.loc[mask, 'Message'].shift(1)  # you'd have to check that this is what you want, perhaps you need to shift the mask rather than the df, i'm not sure

编辑:哎呀,错别字

编辑 2 - 你的问题已经改变,我不太确定这会对你有帮助。

【讨论】:

  • 谢谢。星期五现在真的注册这个已经太晚了,大脑炸了,但只是为了检查 - 这是否适用于像上面的例子一样的不同长度的消息?目前我运行循环例如 20 次以捕获长度为 2 到 20 行的消息
  • @KieranIngram 当我写这篇文章时,我的印象是你的数据已经组织在一个数据框中,你正在寻找一种方法来从你的代码中取出循环(我认为你是是的,它效率低下,但很难知道它是否是代码中的限制因素)。当您第一次发布时,看起来您已经有了一个数据框,而现在您似乎正在寻求处理文本文件的帮助,所以我不确定这会有多大帮助。
  • 我不确定提出问题的最佳方式。我在我的较大代码中引用了一些地方,我目前正在使用一小部分真实数据的循环使其工作,但是一旦我尝试真正的大型数据集,代码就会慢得难以忍受。我想我真正的问题是如何在没有循环的情况下对一个巨大的数据集做些什么。我来自 R 背景,我会用直接映射替换循环,例如 newdata$var = olddata$var * 2 而不是使用循环 for i in 1 to 100000 newdata$var[i] = olddata$var[ i] * 2.
  • @KieranIngram 我认为这是一个很好的直觉 - 使用 df.apply 可能是正确的方法(最好是定义一个在你想要的行上工作的函数,然后获取过滤器正确,然后使用 apply 将该函数映射到您想要的位置)。尽管我很难在不了解更多代码的情况下评论性能,但您会很感激。还有一些分析工具可以帮助您确定代码的哪些部分正在花费时间(我不知道什么是好的,我使用 pycharm 并且有一个内置的工具)。祝你好运,希望你能成功。 :)
猜你喜欢
  • 2022-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多