在Generator和Pandas数据框中并行化或加快计算速度

时间:2018-11-07 21:12:50

标签: python pandas parallel-processing cython

我正在通过itertools创建的生成器对事物的排列进行计算。我有这种形式的一段代码(这是一个虚拟的示例):

import itertools
import pandas as pd

combos = itertools.permutations('abcdefghi',2)
results = []
i=0

for combo in combos:
    i+=1 #this line is actually other stuff that's expensive
    results.append([combo[0]+'-'+combo[1],i])

rdf = pd.DataFrame(results, columns=['combo','value'])

除真实代码外,

  • 有数十万个排列
  • 我不是打开i+=1而是打开文件并获取clf.predict的结果,其中clf是经过scikit-learn训练的分类器
  • 我要代替i来存储该预测的值

我认为combo[0]+'-'+combo[1]无关紧要。

这花费了太长时间。我应该怎么做才能使其更快?如:

1)编写更好的代码(也许我应该使用适当的长度初始化results而不是使用append,但这有什么帮助?当我不这样做时,最好的方法是什么?在遍历combs之前知道长度吗?)

2)初始化熊猫数据框而不是列表,并使用apply

3)在熊猫中使用cython?总共新手。

4)parallelizing?我想我可能需要这样做,但是总的来说,这是新手,而且我不知道在列表中还是在熊猫数据框中这样做是否更好。我知道我需要遍历生成器并初始化某种容器before parallelizing

这些选项的哪种组合最好,我如何将它们组合在一起?

1 个答案:

答案 0 :(得分:-1)

熊猫中的append操作和for循环很慢。此代码避免使用它。

import itertools
import pandas as pd

combos = itertools.permutations('abcdefghi',2)
combo_values = [('-'.join(x[1]), x[0]) for x in enumerate(combos, 1)]

rdf = pd.DataFrame({'combos': [x[0] for x in combo_values],
                    'value': [x[1] for x in combo_values]})

您可以对每个文件和数据框执行此操作,然后使用pd.concat快速生成结果。如果需要,还可以在以后添加排列的枚举。