Python 有效地整合并行执行的结果?

Python 有效地整合并行执行的结果?,python,pandas,concurrency,parallel-processing,Python,Pandas,Concurrency,Parallel Processing,我有一个大约100万行的熊猫数据帧。并行处理在多核机器上运行良好,每个核的利用率为100%。但是,executor.map()的结果是一个生成器,因此为了实际收集处理后的结果,我对该生成器进行了迭代。这是非常非常慢(小时),部分原因是因为它是单核的,部分原因是循环。事实上,它比my\u函数()中的实际处理慢得多。 有没有更好的方法(可能是并发的和/或矢量化的) 编辑:将pandas 0.23.4(目前最新版本)与Python 3.7.0一起使用 import concurrent import

我有一个大约100万行的熊猫数据帧。并行处理在多核机器上运行良好,每个核的利用率为100%。但是,
executor.map()
的结果是一个生成器,因此为了实际收集处理后的结果,我对该生成器进行了迭代。这是非常非常慢(小时),部分原因是因为它是单核的,部分原因是循环。事实上,它比
my\u函数()中的实际处理慢得多。

有没有更好的方法(可能是并发的和/或矢量化的)

编辑:将pandas 0.23.4(目前最新版本)与Python 3.7.0一起使用

import concurrent
import pandas as pd

df = pd.DataFrame({'col1': [], 'col2': [], 'col3': []})

with concurrent.futures.ProcessPoolExecutor() as executor:
    gen = executor.map(my_function, list_of_values, chunksize=1000)

# the following is single-threaded and also very slow
for x in gen:
    df = pd.concat([df, x])  # anything better than doing this?
return df

以下是与您的案例相关的基准:

正如您所看到的,多次concat(append)是非常低效的。您应该只做
pd.concat(gen)
。我相信Underlyg实现将预先分配所有需要的内存


在您的情况下,每次都会进行内存分配。

我认为只要
pd.concat(gen)
就可以了,而且应该会更快,尽管总体来说这可能还是相当缓慢。我尝试过(请参见Sraw答案的注释),但不支持。为什么您仍然在调用
concat
时使用
df
。它应该是
df=pd.concat(gen)
噢,我们将这些附加到现有的df。你说得对,这里不需要这个问题,我现在就试试。谢谢@ALollz,它工作得很好。我试过
pd.concat([df,gen])
但是得到了
TypeError:无法连接类型为“”的对象;只有pd.Series、pd.DataFrame和pd.Panel(已弃用)对象是有效的
。这从根本上说是问题的关键,是否存在类似的东西。@wishihadabettername首先尝试将其转换为列表<代码>列表()毕竟是不需要的,但我必须分两个阶段来完成,首先将生成器转换为自己的数据帧,
df2=pd.concat(gen)
然后将其与现有数据帧连接起来,
df\u final=pd.concat([df,df2])
。第二步不在基本问题的范围内,但在问题中出现了,所以我在这里明确说明。谢谢@Sraw和@ALoltz。是的,我认为它不需要转换就可以工作。我相信现在快多了?是的,快多了。